map() 메서드는 배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환한다.
(출처: https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map)
위의 문제에서 map()을 사용하면 좋은 점은, 각 요소에 대해 접근할 수 있다는 것이다.
참여한 사람(participant)과 완주한 사람(completion)의 요소는 단 하나만 차이가 나고, 그 하나를 알기 위해서는 요소 하나 하나에 접근해야 하기 때문이다.
function solution(participant, completion) {
participant.sort()
completion.sort()
for(let i = 0; i< participant.length; i++){
if(participant[i] !== completion[i]){
return participant[i]
}
}
}
두 배열(participant, completion)을 정렬하는 이유는 뒤에서 for문으로 인덱스순대로 비교하기 때문이다.
정렬을 한 상태여야만 participant에만 하나 더 들어 있는 사람의 이름을 정확히 캐치할 수 있다.
sort() - O(n log(n))
: 인자값으로 넘어온 함수에 따라 값을 정렬한다.
(funtion이 없을 경우, Unicode 값으로 정렬한다.)
function solution(participant, completion) {
const map = new Map();
participant.forEach(p =>{
if(map.get(p)){
map.set(p, map.get(p)+1);
}else{
map.set(p,1);
}
})
completion.forEach(c =>{
if(map.get(c)){
map.set(c, map.get(c)-1);
}
})
for(const p of participant){
if(map.get(p) >= 1){
return p;
}
}
}
forEach()의 break?
: 기본적으로 forEach()는 break 기능이 없다고 한다.
위의 코드에서 마지막에서만 for문을 쓴 이유도 if 조건문에 해당되는 경우 p를 반환하면서 for문의 반복을 멈춰야 하기 때문이다.
대신 for of 문을 사용해서 배열의 요소들에 하나 하나 접근한다.