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 |
댓글