[코딩테스트 연습]level 1. 완주하지 못한 선수 - 코드분석
2022.07.04 - [javascript/프로그래머스] - [코딩테스트 연습]level 1. 완주하지 못한 선수
2022.07.04 - [javascript] - [Javascript] Hash(해시) - 해시 테이블(hash table) 구현하기
해시를 이해하고 난 뒤에 코드를 다시 분석해 보았다.
function solution(participant, completion) {
const map = new Map();
for(let i = 0; i < participant.length; i++) {
let a = participant[i],
b = completion[i];
map.set(a, (map.get(a) || 0) + 1);
map.set(b, (map.get(b) || 0) - 1);
}
for(let [k, v] of map) {
if(v > 0) return k;
}
return 'nothing';
}
참가자 전체를 for문으로 돌면서, i번째의 참가자와, 완주한사람의 정보를 a,b로 선언했다.
map.set(a, (map.get(a) || 0) + 1);
여덟번째줄을 보면 참가한 사람들을 먼저 map으로 set해준다. key에 맞춰주는 value의 값은 아래와 같다.
map.get으로 해당 값이 존재하는지 확인한 후 (map.get(a)) 존재하지 않으면 undefined 값이 나오게 되는데, 이를 or 0 을 통해 0의 결과값이 나오도록 하였다. 반대로 존재한다면 해당 값이 나타날 것이다.
결과적으로는 참가자 이름의 key값에 value를 +1 을 해 주는 함수이다.
map.set(b, (map.get(b) || 0) - 1);
아홉번째줄은 완주한 사람들에 맞춰서 해당 이름의 key에 value값에서 1을 빼 준다.
set하는 두 함수의 value값으로 뒤에 +1을 주었는데, 숫자로 표기해도 문제가 없는 이유는 문자열이 나올 일이 없기 때문이다. 초기값이 무조건 1로 설정되고, 해당 값에서 +1이나 -1이 되는 형태이기 때문이다.
for(let [k, v] of map) {
if(v > 0) return k;
}
마지막으로 key, value의 형식의 map을 for문을 통해 value가 0보다 큰 경우에 대해서는 참가자의 수가 완주자의 수보다 하나 더 많기 때문에 결국 1보다 큰 값이 있을 것이다. 결과적으로 완주하지 못한 한명의 이름만 남아있을 것이다.