본문 바로가기
Research/Coding Test

해시_완주하지 못한 선수

by RIEM 2023. 11. 16.
728x90

나의 접근 방식

function solution(participant, completion) {
    
    const dictComp = {}
    const dictPart = {}
    
    completion.forEach(el => {
        if(dictComp[el]) {
            dictComp[el]++;
        } else {
            dictComp[el] = 1
        }
    })
     
    participant.forEach(el => {
        if(dictPart[el]) {
            dictPart[el]++;
        } else {
            dictPart[el] = 1
        }
    })
    
    const keys = Object.keys(dictPart)
    
    for(let i = 0; i < keys.length; i++) {
        if(!dictComp[keys[i]]) {
            return keys[i]
        }
        if(dictComp[keys[i]] !== dictPart[keys[i]]) {
            return keys[i]
        }
    }
}

비교하려는 두 배열을 두 세트로 만들어주고, 둘 중 하나의 세트의 keys 배열을 루프돌면서 각 세트의 값이 매칭이 안되는 경우 해당 값을 리턴하는 방식으로 문제를 해결했다.

다른 이의 풀이

다른 사람들의 풀이 방식 중 깔끔한 방식이 있어서 가져와본다.

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';
}

우선 Map을 만든다. 1개 요소가 더 추가된 participant배열의 길이만큼 루프를 돌면서 두 배열의 요소 하나씩 가져와서 map에 추가하거나 제외하는 것을 동시에 진행한다. 이 방식이 흥미로웠다고 생각하는데, part는 참가자 그리고 comp는 완주자이니 참가 - 완주 모두한 사람은 결국 1 - 1, 0이 된다. 완주하지 못한 사람은 -1이 되지 않을 테니 1로 남을 것이다. 

그리고 또 흥미로웠던 점은 map을 for of로 루프 돌때 요소를 [k, v] 키값 배열로 가져올 수 있다는 점이다. 이렇게 되면 다이렉트로 키값에 액세스할 수 있고, 키값이 1이상인지 아닌지만 판단하면 바로 답을 찾을 수 있다. 참 매력적인 부분이라 생각했다.

Takeaway

- map()은 for of로 루프 돌 때 [k, v]라는 키값 배열에 바로 접근할 수 있다
- 루프를 2번 도는 것 대신 -> 하나의 루프 안에서 처리를 2번씩 하는 방법도 고려할 수 있다

출처

프로그래머스

https://school.programmers.co.kr/learn/courses/30/lessons/42576

728x90

'Research > Coding Test' 카테고리의 다른 글

해시_폰켓몬  (0) 2023.11.17
프로그래머스_lv0_안전지대  (0) 2023.11.17
Leetcode_bubbleSort_Height Checker  (0) 2023.04.19
HackerRank_Apple and Orange  (0) 2023.04.12
Leetcode_121. Best Time to Buy and Sell Stock  (0) 2023.04.06

댓글