[Problem Solving] 완주하지 못한 선수

Sean·2023년 1월 12일
0

Problem Solving

목록 보기
22/130

문제

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

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

조건

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

입출력 예시

participantcompletionreturn
["leo", "kiki", "eden"]["eden", "kiki"]"leo"
["marina", "josipa", "nikola", "vinko", "filipa"]["josipa", "filipa", "marina", "nikola"]"vinko"
["mislav", "stanko", "mislav", "ana"]["stanko", "ana", "mislav"]"mislav"

❌틀린 코드

결과

아이디어

  • completion 배열을 Array.prototype.forEach()로 순회하며 해당 사람을 Array.prototype.indexOf()를 이용해 찾아내서 Array.prototype.splice()를 사용하여 participant 배열에서 지워준다.
  • participant 배열에서 남은 한 명이 결국 답이 된다.

코드

function solution(participant, completion) {
    completion.forEach(name => {
        if(participant.indexOf(name) !== -1)
            participant.splice(participant.indexOf(name), 1);
    })
    
    return participant[0];
}

⭕통과한 코드

아이디어

  • JavaScript의 내장 객체 Map을 사용한다.
  • Map.prototype.get() 메소드는 파라미터로 주어진 키에 해당하는 값을 반환하거나 값이 없다면 undefined을 반환한다는 점을 이용한다.
  • for...of문과 디스트럭쳐링 문법을 활용해 Map의 (key, value)쌍을 순회한다.

코드

function solution(participant, completion) {
    var answer = '';
    let map = new Map();
    
    for(let i=0; i<participant.length; i++) {
        let p = participant[i],
            c = completion[i];
        
        map.set(p, (map.get(p) || 0) + 1);
        map.set(c, (map.get(c) || 0) - 1);
    }
    
    for(let [k, v] of map) {
        if(v > 0) answer = k;
    }
    
    // map.forEach((k, v) => {
    //     if(v > 0) answer = k;
    // });
                
    return answer;
}

유형

프로그래머스 고득점 Kit - 해시

질문...

혹시 저기 주석에 있는 코드가 프로그래머스에서는 왜 제대로 작동하지 않는지 아시는 분 계실까요? 브라우저 콘솔창에서는 아무 문제 없는 것 같습니다.

profile
여러 프로젝트보다 하나라도 제대로, 깔끔하게.

0개의 댓글