프로그래머스 - 완주하지 못한 선수

Lellow_Mellow·2023년 4월 29일
1
post-thumbnail

⭐ Lv. 1 - 완주하지 못한 선수

✅ 문제 설명

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

마라톤에 참여한 선수들의 이름이 담긴 배열 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"

예제 #1

  • "leo"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #2

  • "vinko"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #3

  • "mislav"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.

✅ 풀이 코드 + 설명

우선 간단한 풀이부터 살펴보겠습니다. 해당 풀이는 결승선을 통과하지 못한 선수가 단 1명이라는 점을 생각해보면 쉽게 떠올릴 수 있습니다.

우선 participantcompletion을 사전 순으로 정렬합니다. 이후 participantcompletion을 비교해가며 동일한 index에 다른 값이 존재하는 경우를 찾습니다. 해당 경우가 바로 완주하지 못한 사람이 되겠습니다.

function solution(participant, completion) {
    participant.sort();
    completion.sort();
    
    for(let i = 0; i < participant.length; i++){
        if(participant[i] !== completion[i]) return participant[i];
    }
}

해당 문제는 해시 개념을 활용하여 풀이할 수도 있습니다. map을 생성한 이후, participantcompletion을 탐색하여 각 이름의 개수를 세어 저장합니다. participant에 존재할 경우에는 해당 이름의 개수를 하나 증가시켜주고, 반대로 completion에 존재하는 경우에는 이름의 개수를 하나 감소시켜줍니다.

일련의 과정을 거친 map에서 value0보다 큰 경우가 존재한다면, 해당 key가 통과하지 못한 인원의 이름이므로, 해당 인원의 이름을 return 합니다.

function solution(participant, completion) {
    const map = new Map();

    for(let i = 0; i < participant.length; i++) {
        map.set(participant[i], (map.get(participant[i]) || 0) + 1);
        map.set(completion[i], (map.get(completion[i]) || 0) - 1);
    }

    for(let [key, value] of map) {
        if(value > 0) return key;
    }
}

profile
잔잔한 물결에서 파도로, 도약을 위한 도전. 함께하는 성장

0개의 댓글