mondegreen

[240328] 알고리즘 리부트 40일차 - 프로그래머스 완주하지 못한 선수 자바 본문

알고리즘 풀이 및 리뷰/프로그래머스

[240328] 알고리즘 리부트 40일차 - 프로그래머스 완주하지 못한 선수 자바

앙갱 2024. 3. 28. 12:44
반응형

동명이인이 있다는 지시문에 key 값으로 이름을 활용하지 못할 것이라고 생각했다. 그래서 각 배열을 정렬한 후 완주한 배열의 인덱스와 참가한 인덱스의 이름이 서로 맞지 않는다면 그 친구가 낙오한 것이기 때문에 완주한 친구들을 맵에서 지워가면서 확인했다. 정렬을 해야한다는 단점이 존재했다.

import java.util.*;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        
        Arrays.sort(participant);
        Arrays.sort(completion);
                
        HashMap<Integer, String> completed = new HashMap<>();
        
        for(int i = 0; i< completion.length; i++) completed.put(i, completion[i]);        
        
        for(int i = 0; i< participant.length; i++){
            
            if(i == participant.length-1) {
                answer = participant[i]; 
                break;
            }
            
            if(completed.get(i).equals(participant[i])) completed.remove(i);
            else{
                answer = participant[i];
                break;
            }
        }
        
        return answer;
    }
}

하지만 마라토너의 이름을 키 값으로 활용할 수 있었다. 방법은 value에 정수로 값을 더해주면서 참가한 애를 먼저 더해주고 완주한 경우 정수 값을 1씩 줄여주는 방법이다. 마지막에는 아직 1로 남아있는 값을 가진 키를 찾아야 하기 때문에 map.keySet()으로 키 리스트를 뽑아내고 값이 0이 아닌 친구를 찾아서 반환해준다. 확실히 짧은 시간 안에 통과하는 것을 알 수 있다.

import java.util.*;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";      

                
        HashMap<String, Integer> marathon = new HashMap<>();
     
        
        for(int i = 0; i< participant.length; i++){
            marathon.put(participant[i], marathon.getOrDefault(participant[i], 0) +1);
        }
        
        for(int i = 0; i< completion.length; i++){
            marathon.put(completion[i], marathon.get(completion[i]) -1);
        }
        
        for(String i: marathon.keySet()){
            if(marathon.get(i) != 0) answer = i;
        }
        
        return answer;
    }
}

반응형