[프로그래머스-Level 1] [JavaScript] 완주하지 못한 선수 - Hash 사용

2022. 12. 1. 21:45알고리즘/프로그래머스 알고리즘 공부

반응형

[문제]

마라톤 선수들이 마라톤에 참여하여 1명의 선수만 완주하지 못하고 모두 마라톤을 완주한다고 가정합니다. 마라톤 참가자 배열 participant와 완주한 참가자 배열인 completion이 입력값 매개변수로 주어질 때, 완주하지 못한 선수를 return해보세요. 입력 테스트 값은 아래와 같습니다. 

 

participant (참가한 선수) completion (완주한 선수) return (완주하지 못한 선수)
["leo", "kiki", "eden"] ["eden", "kiki"] "leo"

 

[알고리즘]

Hash 데이터 자료형을 사용합니다. 즉 Map 또는 객체(Object) 형태를 사용하시면 됩니다.

 

[풀이]

저는 객체로 풀이를 진행했습니다. 먼저 객체 변수 players를 선언하고 participant를 forEach 반복문을 사용하여 players[i] 키의 value 값으로 배열을 넣어준 뒤 각각의 i값으로 선수의 이름을 key 값으로 하여 value에 true를 배열에 넣어줍니다. 만약 leo가 2명이라고 하더라도 players["leo"] = [true, true]가 들어가게 되어 동명이인이여도 완주 여부를 알 수 있습니다. 이제 참가한 선수들은 모두 완료했으니 완주한 선수들에 대한 로직을 구성하면 됩니다. 완료한 선수들이 있다면 그대로 pop으로 true 값 넣었던 것을 제거하면 됩니다. 마지막으로 players[key].length > 0을 이용하여 완주하지 못한 선수는 배열에 true값이 하나 남아 있기 때문에 완주하지 못한 선수를 가려낼 수 있습니다. 위 테스트 예시에서는 players["leo"]에는 [true]가 남아 있어 players["leo"].length는 1이 되기 때문에 "leo"가 반환되어 결과를 알 수 있습니다.

function solution(participant, completion) {
    // 선수 객체 선언
    const players = {};
    
    // 선수 객체 key값의 value에 true를 푸쉬한다. (참가자인지 여부)
    participant.forEach(i => {
        if (players[i] === undefined) {
            players[i] = [];
        }
        players[i].push(true);
    });
    
    // 완료한 선수 중에 리스트가 있다면 true를 빼준다. (완주하지 못한 선수를 가려냄)
    completion.forEach(i => players[i].pop());
    
    // 완주하지 못한 선수를 return한다.
    for (const key in players) {
        if (players[key].length > 0)
            return key;
    }
}

 

반응형