Nevertheless

[JAVA] 완주하지 못한 선수 본문

코딩테스트/Programmers

[JAVA] 완주하지 못한 선수

hxx_1 2024. 6. 8. 17:09

< 내 풀이 >

import java.util.*;
class Solution {
    public String solution(String[] participant, String[] completion) {
        Arrays.sort(participant);
        Arrays.sort(completion);
        
        String answer="";
        
        for(int i=0;i<completion.length;i++){
            if(!completion[i].equals(participant[i])){
                answer+=participant[i];
                break;
            }
        }
        
        if(answer.equals(""))
            answer+=participant[participant.length-1];
        
        
        return answer;
    }
}

 

✏️ 풀이 방법

 

1. 참가자와 완주자를 알파벳 순으로 정렬한다.

2. 정렬을 하고 난 후의 참가자와 완주자의 이름이 다르면 answer에 해당 참가자 이름을 추가한 후, break 

ex) participant={"mislav", "stanko", "mislav", "ana"} , completion={"stanko", "ana", "mislav"} 일 때 

정렬 후에는 participant={ "ana" , "mislav", "mislav" ,"stanko"} , completion={ "ana" , "mislav" ,"stanko"} 가 된다. 완주하지 못한 선수는 딱 1명 이므로 completion의 배열을 돌며 둘의 값을 비교했을때 [2] 번째 값이 다름을 확인할 수 있다. 그러므로 완주하지 못한 선수는 mislav 이다.

3. 만약 answer에 추가된 값이 없으면 참가자 배열의 맨 마지막 값이 완주하지 못한 선수이다. 

: 추가된 값이 없다 => 완주자 배열의 길이만큼 돌 때의 값이 참가자 배열의 값과 같았다. 완주자 배열의 길이는 참가자 배열의 길이보다 1 작으므로 참가자 배열의 마지막 값이 완주하지 못한 선수이다. 

 

< 다른 사람의 풀이 >

import java.util.HashMap;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        HashMap<String, Integer> hm = new HashMap<>();
        for (String player : participant) hm.put(player, hm.getOrDefault(player, 0) + 1);
        for (String player : completion) hm.put(player, hm.get(player) - 1);

        for (String key : hm.keySet()) {
            if (hm.get(key) != 0){
                answer = key;
            }
        }
        return answer;
    }
}

➡️ 해시맵에서 하용하는 get과 getOrDefault의 차이점을 알고 싶어서 찾아봤는데, get( ) 메서드는 요청된 키 값을 찾을 수 없는 경우 "null"이 반환되고, getOrDefault( ) 메서드는 키와 연결된 값이 있을 경우 해당 값이 반환되고, 해당 키 값이 없으면 매개변수로 전달된 defaultValue가 반환된다. 위 풀이의 hm.getOrDefault(player, 0) 에서  0이 기본값이다. 

 

✍🏻 느낀점

 

이 문제는 처음에 어떻게 풀까 고민을 하다가 결국 힌트를 보고 나서야 풀었다. 어려운 문제는 아니지만 조금의 아이디어가 필요한 것 같다. 문제가 해시로 분류되어 있기 때문에 위의 풀이처럼 해시맵을 이용해서 푸는게 좀 더 출제 의도에 맞지 않나 싶다. 해시맵에 어느 정도 익숙해졌다고 생각했는데, 이러한 문제를 보고는 바로 안떠오르는 것 같다. 이번 문제로 getOrDefault ( ) 메서드에 대해서도 배웠으니 다음에는 잘 활용해봐야겠다.

 

 

 

 

참고 블로그


https://junghn.tistory.com/entry/JAVA-Map-getOrDefault-%EC%9D%B4%EB%9E%80-%EC%82%AC%EC%9A%A9%EB%B2%95-%EB%B0%8F-%EC%98%88%EC%A0%9C // getOrDefault 에 대하여 

https://codegym.cc/ko/groups/posts/ko.610.javaui-hashmap-getordefault-mesodeu // getOrDefault 에 대하여 2

'코딩테스트 > Programmers' 카테고리의 다른 글

[JAVA] 이웃한 칸  (1) 2024.06.10
[JAVA] 숫자 짝꿍  (0) 2024.06.08
[JAVA] 크레인 인형 뽑기 게임  (0) 2024.06.01
[JAVA] 성격 유형 검사하기  (0) 2024.06.01
[JAVA] 바탕화면 정리  (0) 2024.05.27