
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 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" |
시간복잡도를 고려하지 않고, 단순히 문제 해결에만 집중해서 풀었을 때의 코드이다.
function solution(participant, completion) {
var answer = '';
for (var i = 0; i < participant.length; i++){
if (completion.includes(participant[i])) {
completion.splice(completion.indexOf(participant[i]), 1);
} else {
answer = participant[i];
}
}
return answer;
}
includes → O(n)indexOf + splice → O(n)참가자가 100,000명일 때, 최악의 경우 수천만 번 연산 → 시간 초과 발생
아래는 해시맵을 사용해서 해결한 코드이다.
function solution(participant, completion) {
let map = new Map();
for (let i = 0; i < participant.length; i++) {
map.set(participant[i], (map.get(participant[i]) || 0) + 1);
}
for (let i = 0; i < completion.length; i++) {
map.set(completion[i], map.get(completion[i]) - 1);
}
return [...map].filter(([_, value]) => value > 0)[0][0];
}
participant 배열 → 이름별 등장 횟수를 Map에 저장completion 배열 → 해당 이름의 횟수를 1씩 감소이렇게 풀게 된다면,
participant 순회 → O(n) completion 순회 → O(n)해시맵으로 해결 후,
다른 사람들의 풀이를 확인해보니 배열 정렬 후, 인덱스값을 서로 비교하는 방법도 있었다.
function solution(participant, completion) {
var answer = '';
participant = participant.sort();
completion = completion.sort();
for (var i = 0; i < participant.length; i++){
if (participant[i] !== completion[i]) {
answer = participant[i];
break;
};
}
return answer;
}