
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 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" |
쉬운 문제이지만, 시간 초과 문제로 어려움을 겪었던 문제
completion에 있는 이름을 participant에서 삭제한다.participant에 남은 이름을 문자열로 리턴한다.function solution(participant, completion) {
completion.forEach(person => {
let index = participant.indexOf(person);
participant.splice(index,1);
})
return participant.join('')
}
이 코드를 사용할 경우 ⏰시간 초과 오류가 발생한다.
이유는 splice() 함수가 시간이 오래 걸리기 때문이다.
현재 코드에서는 forEach 안에 splice()가 있기 때문에 시간이 오래 걸린다.
따라서, 이런 경우 해시 맵(Hash Map, 쉽게 말해서 Key-Value의 구조) 를 이용하여 시간을 줄일 수 있다. JS 에서는 Map을 사용할 수 있겠다.
// 1. Map 생성하기
new Map();
// 2. 값 추가하기 (key를 이용해 value를 저장)
map.set(key, value);
// 3. 값 조회하기 (key가 존재하지 않으면 undefined 반환)
map.get(key);
// 4. 값 수정하기
map.set(key, newValue);
// 5-1. 값 삭제하기
map.delete(key);
// 5-2. 모든 값 삭제하기
map.clear();
// 6. Map 크기 확인하기
map.size;
// 7. Map 순회하기
for (const [key, value] of map) {
console.log(`key: ${key}, value: ${value}`);
}
// 8. 특정 key 존재 여부 확인하기 (존재하면 true, 아니면 false)
map.has(key);
// 9. 모든 key 또는 value 가져오기
const keyArr = Array.from(map.keys());
const valueArr = Array.from(map.values());
// 10. 모든 key-value 쌍 가져오기
const allArr = Array.from(map.entries());
function solution(participant, completion) {
const map = new Map();
for(let name of participant){
if(map.has(name)){
let num = map.get(name);
map.set(name, num+1)
} else{
map.set(name, 1);
}
}
for(let name of completion){
let num = map.get(name);
map.set(name, num-1);
}
for(let [key, value] of map){
if(value !== 0){
return key
}
}
}
Map을 활용하니 바로 통과했다.
시간을 줄일 수 있는 방법을 고민하게 됐던 문제이다.
시간 절약을 위해 Map을 활용하는 방법을 익혀둬야겠다.
문제 링크 🔗 https://school.programmers.co.kr/learn/courses/30/lessons/42576