var c = ['프로그래머스', '완주하지 못한 선수'];

fbghgus123·2021년 2월 17일
0
post-thumbnail

❓ 문제

코딩테스트 연습 > 해시 > 완주하지 못한 선수

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

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

👨‍🔧 접근

- 배열을 하나 하나 비교해볼까?

function solution(participant, completion) {
    for(let i=0;i<completion.length;i++){
      for(let j=0;j<participant.length;j++){
        if(completion[i]===participant[j]){
          participant.splice(participant.indexOf(completion[i]),1);
          break;
        }
      }
    }
    const answer = participant[0];
    return answer;
}

효율성 면에서 실패 ....

어떻게 효율적으로 비교할 수 있을까?

- Set의 사용

역시 동명이인의 존재로 실패 ...

- Map을 사용해볼까?

function solution(participant, completion) {
    var answer = '';
    const completionMap = new Map();
    
    for(let name of completion){
      if(completionMap.has(name)){
        completionMap.set(name, completionMap.get(name)+1);
      }
      else{
        completionMap.set(name, 1);
      }
    } // completion 배열을 Map 객체로 변환 
    
    for(let name of participant){
      if(!completionMap.has(name)){
        return name;
      }
      else{
        completionMap.set(name, completionMap.get(name)-1);
        if(completionMap.get(name)===-1){
          return name;
        }
      }
    } // 참가자 명단을 비교하며 이름이 있을 때마다 해당 키의 값을 하나씩 없앤다. 
    // 중간에 해당 키의 값이 -1이 되면 해당 키를 반환
}

- 이렇게 쉬운 방법이 ...

허탈하게 만들었던 다른 사람의 풀이

function solution(participant, completion) {
    participant.sort();
    completion.sort();

    for(let i in participant) {
        if(participant[i] !== completion[i]) return participant[i];
    }
}

👨‍🏫 리뷰

  • Map과 Set에 대하여 배울 수 있었다. 참고
profile
컴공과 학생 입니다.

0개의 댓글

관련 채용 정보