function solution(participant, completion) {
let answer = '';
participant.forEach((member) => {
if(!completion.includes(member)){
answer = member;
}else{
completion.splice(completion.indexOf(member), 1);
}
});
return answer;
}
이렇게 풀면, 정확성은 모두 통과하지만 효율성은 모두 탈락한다(...)
카테고리가 Hash 이니 Hash를 복기하며 풀어본다.
function solution(participant, completion) {
let answer = '';
const part = participant.sort();
const comp = completion.sort();
for(let i = 0; i < part.length; i++){
if(part[i] !== comp[i]){
answer = part[i];
break;
}
}
return answer;
}
너무 어이없게도, sort()
를 통해 정렬한 후 반복문을 돌려서 같은 인덱스에 서로 다른 값이 나오면 해당 값이 정답이 된다.
어이없긴 하지만, 올바른 로직이긴하다.
function solution(participant, completion) {
let answer = '';
//map 생성
const runnerMap = new Map();
//participant 돌면서 map에 넣기
participant.forEach((member) => {
//runnerMap에 등록된 동명이인이 있다면, value를 +1
//없다면 등록
if(runnerMap.get(member)) runnerMap.set(member, runnerMap.get(member) + 1);
else runnerMap.set(member, 1);
});
//완주자는 runnerMap에서 제거
completion.forEach((comp) => {
//완주자 명단의 이름이 runnerMap에 있다면, value를 1씩 낮춰줌
if(runnerMap.get(comp)) runnerMap.set(comp, runnerMap.get(comp) - 1);
})
//participant 돌면서 0명보다 많이 남아있는 인원 찾아내기
participant.forEach((member) => {
if(runnerMap.get(member) > 0) answer = member;
})
return answer;
}
코드에 대한 상세 풀이는 주석으로 작성해놓았다.
Map
을 이용하여 해시를 구현하였고, 풀이하였다.
function solution(participant, completion) {
let answer = '';
let runnerObj = [];
participant.forEach((member) => {
runnerObj[member] = runnerObj[member] ? runnerObj[member] + 1 : 1;
})
completion.forEach((comp) => {
runnerObj[comp] = runnerObj[comp] - 1 ;
})
for(let name in runnerObj){
if(runnerObj[name] > 0){
answer = name;
break;
}
}
return answer;
}
이번엔 object
를 기반으로 해시를 적용해보았다.
로직 자체는 Map
을 사용한 것과 동일하다.