해시맵을 이용한 풀이이다.
map객체를 사용하고 싶었으나 ide가 없는 프로그래머스에서는 힘들어서...;
Object를 이용했다.
function solution(participant, completion) {
var answer = "";
const map = {};
completion.forEach((element) => {
if (map[element]) {
map[element] = map[element] + 1;
} else {
map[element] = 1;
}
});
for (i of participant) {
if (map[i]) {
map[i] = map[i] - 1;
} else {
answer = i;
break;
}
}
return answer;
}
completion의 갯수가 participant 갯수보다 항상 1이 작고, 동명 이인이 있을 수 있다.
이 점을 이용해서 completion으로 먼저 해시맵을 만들고,
participant를 순회하면서 하나씩 차감해나간다.
for-in은 배열가능한 객체의 key를 순회하고,
for-of는 배열가능한 객체의 element를 순회한다.
participant라는 배열의 element를 for-of로 순회하며, forEach는 break가 불가능한 반면 for-of는 break가 가능하다는 점에서 유리한 면이 있다.
Map객체를 이용하여 풀이하면 아래와 같다.
function solution(participant, completion) {
const map = new Map();
completion.forEach(name => {
map.set(name, map.has(name) ? map.get(name) + 1 : 1);
});
for (const name of participant) {
const count = map.get(name) || 0;
if (count === 0) {
return name;
} else {
map.set(name, count - 1);
}
}
return null;
}
둘 간의 성능 차이는 map을 이용한 방식이 10~20% 빠르지만 효율성에서는 차이가 없었다. 둘 모두 요소에의 접근에 대해 O(1)의 시간 복잡도를 갖는다.
Object를 이용하는 경우
정확성 테스트
Test 1 〉 통과 (0.09ms, 33.5MB)
Test 2 〉 통과 (0.11ms, 33.4MB)
Test 3 〉 통과 (0.29ms, 33.4MB)
Test 4 〉 통과 (0.47ms, 33.8MB)
Test 5 〉 통과 (0.45ms, 33.7MB)
Test 6 〉 통과 (0.05ms, 33.4MB)
Test 7 〉 통과 (0.08ms, 33.6MB)
효율성 테스트
Test 1 〉 통과 (16.76ms, 53.7MB)
Test 2 〉 통과 (23.84ms, 58.3MB)
Test 3 〉 통과 (24.32ms, 62.2MB)
Test 4 〉 통과 (31.27ms, 68.9MB)
Test 5 〉 통과 (56.97ms, 71.7MB)
Submission result
정확성: 58.3
효율성: 41.7
Total score: 100.0 / 100.0
Map을 이용하는 경우
정확성 테스트
Test 1 〉 통과 (0.07ms, 33.5MB)
Test 2 〉 통과 (0.08ms, 33.4MB)
Test 3 〉 통과 (0.31ms, 33.5MB)
Test 4 〉 통과 (0.39ms, 33.6MB)
Test 5 〉 통과 (0.37ms, 33.7MB)
Test 6 〉 통과 (0.05ms, 33.4MB)
Test 7 〉 통과 (0.07ms, 33.4MB)
효율성 테스트
Test 1 〉 통과 (14.17ms, 52.4MB)
Test 2 〉 통과 (32.21ms, 59.5MB)
Test 3 〉 통과 (25.47ms, 61.8MB)
Test 4 〉 통과 (34.61ms, 64.3MB)
Test 5 〉 통과 (36.39ms, 67.1MB)
Submission result
정확성: 58.3
효율성: 41.7
Total score: 100.0 / 100.0