javascript/프로그래머스

[코딩테스트 연습]level 1. 완주하지 못한 선수 - 코드분석

sewonzzang123 2022. 7. 6. 15:08
반응형

2022.07.04 - [javascript/프로그래머스] - [코딩테스트 연습]level 1. 완주하지 못한 선수

 

[코딩테스트 연습]level 1. 완주하지 못한 선수

문제 수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한

sewonzzang.tistory.com

2022.07.04 - [javascript] - [Javascript] Hash(해시) - 해시 테이블(hash table) 구현하기

 

[Javascript] Hash(해시) - 해시 테이블(hash table) 구현하기

해시란? 해시 함수(hash function)는 에서 얻어지는 값은 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수입니다. 해시 함수에 의해 얻어지는 값을 해시라고 부릅니다. 해시함수의 용

sewonzzang.tistory.com


해시를 이해하고 난 뒤에 코드를 다시 분석해 보았다.

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보다 큰 값이 있을 것이다. 결과적으로 완주하지 못한 한명의 이름만 남아있을 것이다.

반응형