알고리즘

프로그래머스 - 달리기 경주

Heidong 2023. 9. 18. 03:01
반응형

 

내 풀이 - 1 (시간초과)

import java.util.*;

class Solution {
    
    public Map<String, Integer> swap(Map<String, Integer> map, String call) {
        int call_idx = map.get(call);
        // System.out.println(call_idx);
        
        for(Map.Entry<String, Integer> entry : map.entrySet()) {
            String key = entry.getKey();
            Integer value = entry.getValue();
            // System.out.println(key +":"+ value);
            if(value == call_idx-1) {
                map.put(key, value+1);
                // System.out.println("change key: " + key);
            }
            if(key.equals(call)) {
                map.put(key, value-1);
                // System.out.println("change call: " + key);
            }
        }
        return map;
    }
    
    public String[] solution(String[] players, String[] callings) {
        String[] answer = new String[players.length];
        Map<String, Integer> map = new HashMap<>();
        
        for(int i=0; i<players.length; i++) {
            map.put(players[i], i);
        }
        
        for(int i=0; i<callings.length; i++) {
            String call = callings[i];
            map = swap(map, call);
        }
        
        map.forEach(
            (k,v) -> 
                // System.out.println(k +":"+ v)
                answer[v] = k
        );
        
        // System.out.println();
        // System.out.println(Arrays.asList(answer));
        return answer;
    }
}

내 풀이 - 2 (시간초과)

import java.util.*;

public class P_48 {
	
    public String[] solution(String[] players, String[] callings) {
        String[] answer = new String[players.length];
        Map<String, Integer> map = new HashMap<>();
        
        // map으로 플레이어별 인덱스 매핑
        for(int i=0; i<players.length; i++) {
            map.put(players[i], i);
        }
        
        for(int i=0; i<callings.length; i++) {
            String call = callings[i];
            int call_idx = map.get(call);
            int front_idx = call_idx-1;
            // 스왑
            // 앞에 있던 유저 인덱스 변경
            for(String key:map.keySet()) {
            	if(map.get(key).equals(front_idx)) { // 값 으로 앞 유저 찾기
            		map.put(key, call_idx);
                    break;
            	}
            }
            // call한 유저 인덱스 변경
            map.put(call, front_idx);
        }
        
        map.forEach(
            (k,v) -> 
                // System.out.println(k +":"+ v)
                answer[v] = k
        );
        
        // System.out.println();
        // System.out.println(Arrays.asList(answer));
        return answer;
    }
}

풀이 1,2번으로 주어진 테스트 케이스는 통과 했으나 전체 통과는 못했다.

아마 배열에 많은 값들이 있을 경우 너무 오래걸려서 시간 초과가 나는 듯 했다.

 

배열에 데이터가 많으면 많을수록 데이터를 찾는데 오래 걸리기 때문이다.

하지만 HashMap에서는 특정 데이터를 접근할때 키 값으로 바로 찾아 갈 수 있기 때문에 데이터가 아무리 많아도 

속도가 느려지지 않는다.

 

하지만 풀이2에서 해쉬맵을 통해서 문제를 풀었는데도 시간 초과가 났다.

스왑하는 과정에서 해쉬맵을 이용했지만 푸는 방법을 배열처럼 데이터 하나하나 다 돌게끔 코드를 작성 했기 때문이다.

해쉬맵을 이용만 했을뿐 방법은 배열을 가지고 푼거랑 차이가 없었던 것 이다.

 

내 풀이 - 3 (통과)

import java.util.*;

class Solution {
    
    public String[] solution(String[] players, String[] callings) {
        Map<String, Integer> map = new HashMap<>();
        
        // 플레이어 이름과 순번 map에 담기
        for(int i=0; i<players.length; i++) {
            map.put(players[i], i);
        }
        // 스왑
        for(int i=0; i<callings.length; i++) {
            String call = callings[i];
            int call_idx = map.get(call);
            String front = players[call_idx - 1];
            int front_idx = map.get(front);
            players[call_idx] = front;
            players[front_idx] = call;
            // map도 바꿔주기
            map.put(front, call_idx);
            map.put(call, front_idx);
        }

        return players;
    }
}

이번에는 데이터를 찾아가는 방식을 해쉬맵의 특징을 이용해서 잘 문제를 풀었다.

배열 데이터 도는거는 주어진 플레이어와 콜링의 배열뿐이고 스왑하는 과정에서 해쉬맵의 특징인 값으로 바로 찾아가는 방식으로 풀었다.

이렇게 했더니 시간 초과문제를 해결 하였다.

반응형