수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
function solution(participant, completion) {
/*
participant, completion을 정렬한다.
정렬한다면 순서대로 정렬이 되어있으므로 idx마다 비교를 하고 값이 같지 않다면 명단에서 빠진 것
*/
let answer = '';
participant.sort()
completion.sort()
for (let i = 0; i < participant.length; i++) {
if (participant[i] !== completion[i]) {
answer = participant[i];
break;
}
}
return answer;
}
indexOf
를 이용해 비교를 하려했는데 indexOf
도 결국은 반복을 또 하는 코드라는걸 배웠다. 그래서 indexOf
를 삭제하고 직접 비교를 했다. 애초 indexOf
를 쓰면 더 효율적이라고 생각했던 내 생각이 틀렸다. 좋은 걸 배웠다. function solution(participant, completion) {
completion.map(name => completion[name] = (completion[name] | 0) + 1);
//completion[name] 이 존재한다면 completion[name] = completion[name] + 1
//존재하지 않는다면 completion[name] = 0 + 1;
return participant.find(name => !completion[name]--);
}
새로 알게된 점.
Obj[key]
를 이용해 접근할 수 있다는 것!이 부분과 논리 연산자를 이용해 completion을 순회하면서 배열안에 [key, value]
형태로 값을 넣는다.
let arr = ['eden', 'kiki', 'kiki'];
arr.map(name => arr[name] = (arr[name] | 0) + 1)
console.log(arr);// ["eden", "kiki", "kiki", eden: 1, kiki: 2]
위 코드처럼 콘솔에 직접 쳐보면 기존 배열 요소가 들어가 있고 추가적으로 객체의 key, value 형태로 값이 들어가있다.
즉, 레퍼런스 코드는 completion[name]
이 존재한다면 completion[name] = completion[name] + 1
, 존재하지 않는다면 completion[name] = 0 + 1;
그리고나서 falsy(0, fasle, NaN, null, undefined..)타입을 이용해 completion[name]
이 0보다 크다면 truthy한 값이므로 !completion[name]--
은 거짓이 되고 마지막에 1을 감소시켜준다. find
는 해당 배열의 요소를 순회하기 때문에 요소를 반복하면서 조건이 true가 나오는 경우, 즉 completion[name] === 0
인 경우에 그 요소를 리턴하면 완주하지 못한 사람을 찾을 수 있다.