프로그래머스(Level1-11) 완주하지 못한 선수

문제요약:
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

제한사항
마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
completion의 길이는 participant의 길이보다 1 작습니다.
참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
참가자 중에는 동명이인이 있을 수 있습니다.

구현코드:

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        int k[] =new int[participant.length];
        for(String com:completion){
            for(int i=0;i<participant.length;i++){
                if(com.equals(participant[i])){
                    if(k[i]==0){
                        k[i]=1;
                        break;
                    }
                }
            }
        }
        for(int i=0;i<participant.length;i++){
            if(k[i]==0){
                answer=participant[i];
                break;
            }
        }
        return answer;
    }
}

맨처음 구현한 코드는 다음과 같다. 간단하게 하기위해 participant 배열과 completion 배열을 비교하여 만약 같은게 있다면 k 배열에 1을 넣는 방법이다. 이렇게 하면 동명이인도 해결 할 수있다. 근데 정확성 테스트는 통과했지만, 효율성 테스트는 통과하지 못했다.

해시를 사용해야하는 문제이기 때문이다.
해시를 사용하는 방법은 간단하다. 위에서 했던 것과 마찬가지로 k 배열을 HashMap<String,Integer>로 만들어서 String 엔 participant,Integer에는 1을 넣으면 된다.
이제 HashMap 으로 구현 한 코드를 보여드리겠습니다.

import java.util.*; 
class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        HashMap<String,Integer> map=new HashMap<>();
        for(String part:participant){
            map.put(part,map.getOrDefault(part, 0) + 1);
        }
        for(String com:completion){
            map.put(com,map.get(com)-1);
        }
        for(String key:map.keySet()){
            if(map.get(key)!=0){
                answer=key;
                break;
            }
        }

        return answer;
    }
}

코드해석:
우선 이 문제의 핵심은 동명이인을 어떻게 처리할 것이냐의 문제인 것 같습니다.
즉 hashmap 을 사용하여도 hashmap 에는 키 값이 중복이 안되기 때문에 동명이인이있다면 뒤에 integer 쪽 에서 +1을 더 해주어야 하는 것이지요. 풀이를 보던중 getOrDefault(Object key, V DefaultValue)에 대하여 알게되었습니다. 즉 get 을 할때 key값이 있다면 가져오고 없다면 default 값을 해주는 것 ! 그래서 동명이인이 2명 있다면 값은 2 가 되고 다음 for 문에서 다시map.put을 해주기 때문에 동명이인 처리가 가능 ! 그래서 완주하지 않은 사람의 값은 1이 되고 answer에 key 값을 넣어주면 끝.

좋은 웹페이지 즐겨찾기