수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 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];
}
}
}
.sort() 를 이용해서 정렬하고 비교하면 중간에 어느 인덱스에선다 서로 다른 값을 갖고있는 지점이 만나게 된다.function solution(participant, completion) {
participant.sort();
completion.sort();
for(let i in participant) {
if(participant[i] !== completion[i]) return participant[i];
}
}
동일한 방식으로 풀었는데 몇 가지 주의할 점이 풀이 댓글에 있어서 퍼왔다.
for ... in은 성능을 하락시킨다는 의미보다는 객체 내의 프로퍼티 속성 중 enumerable: true인 모든 프로퍼티를 순회하여 검색하는 용도이기 때문에 적합하지 않습니다. 최근의 그린 브라우저는 배열에 대해 for ... in을 사용해도 오류가 나지 않지만, Old IE의 경우에는 배열 인덱스 외에 검출되는 프로퍼티가 있기 때문에 undefined 와 같은 오류가 발생합니다. 따라서, 배열에 대해서는 for ... in 구문 보다는 for를 사용하거나 ES6의 forEach 함수를 사용하는 것을 권장합니다. - Bongsu Kang
또한 MDN의 페이지에도 경고문구가 나온다.
Note: for...in은 인덱스의 순서가 중요한 Array에서 반복을 위해 사용할 수 없습니다.
그냥 풀기만 급급했는데 메소드나 문법에 따라 그 쓰임새가 있었다.
이번에는 풀긴 풀었어도 출제자의 의도대로 푼 느낌이 강하게 들어서 다른 풀이도 또한 들고와봤다.
또다시 나타난 .reduce()와 본적은 있지만 써본적은 없는 .find(), 그리고 arrow function이 보인다.
솔직히 아직 해석하면서 공부중이라서 덧붙일게 없다..
며칠내로 아윌비백..
function solution(participant, completion) {
var dic = completion.reduce((obj, t)=> (obj[t]= obj[t] ? obj[t]+1 : 1 , obj) ,{});
return participant.find(t=> {
if(dic[t])
dic[t] = dic[t]-1;
else
return true;
});
}