달리기 경주

Seongjin Jo·2023년 5월 9일
0

프로그래머스 LV1

목록 보기
30/31

문제

풀이

처음 풀이

class Solution {
    public String[] solution(String[] players, String[] callings) {
        String[] answer = {};
        int idx=0;  
        int cnt=0;
        String tmp="";
        
        while(idx<callings.length){
            String str = callings[idx];
            
            while(cnt<players.length){
                if(players[cnt].equals(str)){
                    tmp = players[cnt];
                    players[cnt] = players[cnt-1];
                    players[cnt-1] = tmp;
                }
                cnt++;
            }
            cnt=0;
            idx++;
        }

        return players;
    }
}

배열의 연산은 시간이 오래걸린다는 것을 알았다. 최대한 for문 안쓰고 while문으로 해봤는데도 그냥 똑같다. 그래서 순서를 유지 해주는 HashMap에 정보를 저장해뒀다가 필요한 정보를 get해서 players[]에 저장해주면 된다. 그러면 딱히 연산이 필요없다.

최종 풀이

import java.util.*;

class Solution {
    public String[] solution(String[] players, String[] callings) {
        Map<String, Integer> map = new HashMap<>();
        
        for(int i=0; i<players.length; i++){
            map.put(players[i],i);
        }
        
        for(String player : callings){
            int rank = map.get(player); // 등수
            String beforePlayer = players[rank-1]; // 앞 등수
            
            players[rank-1] = player;
            players[rank] = beforePlayer;
            
            map.put(player,rank-1);
            map.put(beforePlayer,rank);
        }
        return players;
    }
}

map을 만들어준다. HashMap이라서 저장 순서를 기억한다. <이름,등수> 이렇게 저장해준다.
for each문으로 callings를 훑어 본다. player 를 불린 사람이라고 하자.
해당 player의 등수를 map에서 등수를 꺼내온다. 그리고 현재 players[]에서 player의 앞 등수인 사람을 beforePlayer 로 저장. 이렇게 했으면 이제 players[]에 앞등수를 player로 , 뒷 등수를 beforePlayer로 바꿔준다. 그리고 map도 똑같이 갱신해준다.

0개의 댓글