1 minute read

문제 풀이 방식

  • for 문으로 검색해서 swap시켜준다
  • 처음에 시간초과가 떠서 당황했는데, 인덱스 검색할때 해시맵을 써서 시간을 줄이면 된다.
    • 인덱스 검색할때 그냥 컬렉션 indexOf() 쓰면 선형 탐색 시간이 걸리고 이게 또 for 문 내에 있으므로… O(N(callings 길이) * M(players)) 가 된다. 그러면 최악의 경우는  50,000 * 1,000,000 이 되므로 코드 시간 복잡도가 터진다.
    • 문제 풀때 꼭 최악의 경우 시간 복잡도를 생각하기!

문제 풀이 (Java)

시간 복잡도 개선 전 코드 (75 / 100)

import java.util.Arrays;

class Solution {
    public String[] solution(String[] players, String[] callings) {
        String[] answer = Arrays.copyOf(players, players.length);

        for (String calling : callings) {
            int idx = findIdx(answer, calling);
            if (idx >= 0) {
                swap(answer, idx - 1, idx);
            }
        }

        return answer;
    }

    private int findIdx(String[] answer, String calling) {
        for (int i = 0; i < answer.length; i++) {
            if (answer[i].equals(calling)) {
                return i;
            }
        }

        return -1;
    }

    private void swap(String[] answer, int idx1, int idx2) {
        String tmp = answer[idx1];
        answer[idx1] = answer[idx2];
        answer[idx2] = tmp;
    }
}

시간 복잡도 개선 후 코드 (100 / 100)

import java.util.Arrays;
import java.util.HashMap;

class Solution {
    public String[] solution(String[] players, String[] callings) {
        HashMap<String, Integer> playerIndexMap = new HashMap<>();
        String[] answer = Arrays.copyOf(players, players.length);
        for (int i = 0; i < players.length; i++) {
            playerIndexMap.put(players[i], i);
        }
        
        for(String calling : callings){
            // int idx = findIdx(answer, calling);
            int idx = playerIndexMap.getOrDefault(calling, -1);
            
            if (idx >= 0) 
                swap(answer, idx - 1, idx);
                playerIndexMap.put(answer[idx], idx);
                playerIndexMap.put(answer[idx - 1], idx - 1);
        }
        return answer;
    }
    
    private int findIdx(String[] answer, String calling){
        for(int i = 0; i < answer.length; i++){
            if(answer[i].equals(calling)){
                return i;
            }
        }
        
        return -1;
    }
    
    private void swap(String[] answer, int idx1, int idx2){
        String tmp = answer[idx1];
        answer[idx1] = answer[idx2];
        answer[idx2] = tmp;
    }
}

Leave a comment