프로그래머스
나의 풀이(1)
이 첫 번째 풀이법은 while문에서 반복문이 실행되고, while문 내에서 findIndex로 배열을 순회하고, 마지막에 참가자 배열에서도 find로 배열을 순회한다. 따라서 선형탐색이 중첩되거나 여러번 발생해 효율성 테스트를 통과하지 못한 것 같다.
idx
에 참가자 배열에서 존재하는 완주자 배열의 0번째값 인덱스를 저장한다. (여기서 사용된 findIndex는 배열에 동일한 값이 존재해도 첫번째 값의 인덱스를 리턴한다. 없으면 -1을 리턴한다.)idx
인덱스 값을 0으로 만든다.function solution(participant, completion) {
//참여자 명단에 있지만, 완주자 명단에 없는 사람을 구한다
//단, 동명이인이 있을 수 있다.
while(completion.length){
const idx = participant.findIndex(el => el === completion[0]);
participant[idx] = 0;
completion.shift();
}
return participant.find((el)=> typeof el === 'string');
}
나의 풀이(2)
문제에서 hash라는 힌트를 주고 있어서 해시에 대해 찾아보았고, 자바스크립트에는 hash table로 object를 사용할 수 있어 객체를 활용해 풀어 통과할 수 있었다.
hash[참가자 배열의 요소]
값이 1보다 크다면 --를 해주고, 그 외 경우는 1명일테니까 삭제시킨다.getOwnPropertyName
으로 가져온 배열의 0번째 값을 리턴한다.function solution(participant, completion){
let hash = {};
for(let i=0;i<participant.length;i++){
if(hash[participant[i]]) hash[participant[i]]++;
else{
hash[participant[i]]=1;
}
}
for(let i=0;i<completion.length;i++){
if(hash[completion[i]]>1) hash[completion[i]]--;
else{
delete hash[completion[i]]
}
}
return Object.getOwnPropertyNames(hash)[0];
}
다른 사람 풀이
- 완주자 배열을 객체로 만든다.
obj[완주자 이름]
가 undefined인 경우,obj[완주자 이름]=1
을 하고, 이미 있다면, ++를 해준다.- 참가자 배열에는 있지만 완주자 객체에는 없는 값을 찾아 리턴한다.
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]--;
else{
return true;
}
});
}
그동안은 조건에 따라 삼항연산자의 두번째, 세번째 값을 리턴
시켰는데, 여기서는 obj[t]에 값이 있으면, obj[t]에 ++를 해주고, 없다면 1을 할당해주고 있다.
그리고, find 메소드를 사용해 조건을 만족하는 true인 경우에 참가자 배열의 값을 바로 리턴시킨다.
hash Table
값을
hash function
을 거쳐hash code
를 만들고,hash code
에 따라 배열에 저장한다. 만약, 동일한hash code
를 가졌다면(colision
), 배열 안에 또다른 배열을 만들어 저장한다.
값을 검색할때,hash code
를 찾아 배열에 인덱스로 활용해 바로 찾을 수 있으므로 대게 O(1)의 시간복잡도를 갖고, 앞서 말한 colision이 발생했다면, 배열안의 배열을 선형탐색하면 되므로 O(n)만큼의 시간복잡도를 갖게된다.
이는 단순히 배열의 요소로 값을 할당해 매번 배열을 선형탐색하지 않아도 되므로 빠르고 편리하다.
reference