https://school.programmers.co.kr/learn/courses/30/lessons/42576
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
- 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
- completion의 길이는 participant의 길이보다 1 작습니다.
- 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
- 참가자 중에는 동명이인이 있을 수 있습니다.
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) {
var answer = '';
completion.forEach((x, idx, arr)=>{
participant.splice(participant.indexOf(x), 1);
})
console.log(participant);
return participant[0];
}
효율성 테스트에서 전부 시간초과 뜸. forEach가 엄청 오래 걸리는 듯 하다.
function solution(participant, completion) {
var answer = '';
for(let i of completion){
participant.splice(participant.indexOf(i), 1);
}
return participant[0];
}
혹시나 해서 for문으로 해봤는데 어림도 없었다.
질문 목록 보니까 indexOf가 별로라고 했다.
function solution(participant, completion) {
var answer = '';
participant.sort();
completion.sort();
participant.forEach((x, idx) =>{
if(answer == ''&&x != completion[idx]){
answer = x;
}
});
return answer;
}
정렬해서 배열 두 개 비교하다가 달라지는 순간을 저장해서 반환해줬더니 됐다.
JS sort 성능 엄청 좋은가보다.
var solution=(_,$)=>_.find(_=>!$[_]--,$.map(_=>$[_]=($[_]|0)+1))
인데 밑에 해설이 있었다.
var solution=(participant,completion)=>participant.find(name=>!completion[name]--,
completion.map(name=>completion[name]=(completion[name]|0)+1))
completion에 대해서 participant에 등장한 횟수를 매핑하고 그러고 등장할 때마다 1씩 빼다가 0이 먼저 되는 애를 찾아서 반환했다고 한다.
splice 메소드를 써야하는데 기억이 안 났다.
array.splice(start, deleteCount, item);
start: 변경 시작할 위치
deleteCount: 제거할 개수
item(s): 추가할 하나 요소(들)