개발Story
article thumbnail

소요시간 : 40분

문제

문제 설명

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

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

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

입출력 예

 

해석 

참가자와 완주자가 있다.

 

완주자 리스트에는 꼭 1명의 완주 못한 사람이 있다. 완주못한 사람을 return하자.

 

처음에는 참가자와, 완주자를 정렬하여 비교 후 맞지 않는 참가자를 구하였지만,

 

정렬하는 sort에 시간복잡도 지적이 많았다.

 

또한 문제의 요지는 hash를 이용해서 해결하는거라 요지도 맞지가 않았다.

 

그래서 다른 풀이를 보던중 해시 풀이가 있어서 다시 풀어보았다.

 

 

==해시 설명 ==

 

참가자 리스트를 json 형태로 만든 후 ++

 

다시 완주자 리스트를 반복문을 돌려 json을 --

 

json을 반복문을 돌려 1인값을 return;

 

 

풀이

function solution(participant, completion) {
     const hash = {};
 
    //참가자 json 형태로 갯수 세서 넣어주기 이름이 중복이 가능하므로 ++로
    for(let val of participant){
        if(!hash[val]) hash[val] = 0;
        hash[val] ++;
    }
    //완주한 리스트에 있으면 다시 --
    completion.forEach(e=>hash[e]--);
    
    //1 : true , 0  : false
    // 완주한 리스트에 없다면 1이 남아있으므로 1일 경우 return
    for(let key in hash){
        if(hash[key]){
            return key;
        }
        
    }
}

복기

간단한 hash문제인데도 너무 오래걸리고 생각조차 하지를 못했다.

 

단순히 구현을 통해서만 문제를 접근하니 한계가 보인다..

profile

개발Story

@슬래기

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!