
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
| participant | completion | return |
|---|---|---|
| ["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"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.
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 객체는 키-값 쌍인 집합이다. 파이썬 dictionary라고 생각하면 될 것 같다.
function solution(participant, completion) {
const map = new Map();
for(let i = 0; i < participant.length; i++) {
let a = participant[i],
b = completion[i];
map.set(a, (map.get(a) || 0) + 1);
map.set(b, (map.get(b) || 0) - 1);
}
for(let [k, v] of map) {
if(v > 0) return k;
}
return 'nothing';
}
Map 객체를 생성하고 participant에 특정 이름(a)가 있으면 a가 key인 value를 1씩 증가시킨다.
반대로 completion에 특정 이름(b)가 있으면 b가 key인 value를 1씩 감소시킨다.
최종 value가 양수이면 participant에는 존재하지만 completion에 존재하지 않으므로, 즉 완주하지 못한 것이므로 해당 value를 return한다.