난이도: Lv. 2
정답률: 49%
문제: https://school.programmers.co.kr/learn/courses/30/lessons/152996
알고리즘
- duplication 맵과 cases 맵을 선언 한다.
- duplication 맵은 key를 몸무게, value를 그 몸무게를 가진 사람의 수로 한다. 중복을 체크하기 위한 맵이다.
- cases 맵은 몸무게에 x2, x3, x4를 계산한 값을 key로 가지고, 해당 값이 몇 개인지를 value로 가진다.
- 파라미터로 주어진 weights 배열을 순회한다.
- duplication에 존재하는 무게인지 확인하고, value를 설정한다.
- x2, x3, x4한 값을 차례로 cases에 넣고, value를 가져온다.. 중복된 몸무게라면 cases의 value에서 2-1에서 구한 value의 값을 뺀 결과를 answer에 더하고, 중복된 몸무게가 아니라면 cases의 value를 answer에 더한다.
코드
function solution(weights) {
let answer = 0;
const duplication = new Map();
const cases = new Map();
const distance = [2, 3, 4];
for(let weight of weights) {
const duplicationCount = duplication.get(weight);
if(duplicationCount) {
duplication.set(weight, duplicationCount + 1);
answer += duplicationCount;
} else {
duplication.set(weight, 1);
}
for(let d of distance) {
const multipleWeight = weight * d;
const caseCount = cases.get(multipleWeight)
if(caseCount) {
cases.set(multipleWeight, caseCount + 1);
answer += duplicationCount ? (caseCount - duplicationCount) : caseCount;
} else {
cases.set(multipleWeight, 1);
}
}
}
return answer;
}
주저리
무수한 착각의 1시간 반을 보냈다. 100N인 사람이 세명이면 결과가 1이어야 하는가 3이어야 하는가에 대해 한참 고민하다가 테케 결과 보니까 후자가 맞는 것 같았다. 그걸 깨달았음에도 불구하고 중복을 어떻게 제거해야 하는지 감이 안 와서 또 한참 고민하다가 어부지리로 깨달아서 겨우 풀었다. 멘토링하러 간다고 마음 급해서 글도 잘 안 써짐^^..........
'코딩테스트' 카테고리의 다른 글
[Python] 크레인 인형 뽑기 게임 (1) | 2024.09.03 |
---|---|
[JS] 호텔 대실 (0) | 2024.05.27 |
[JS] 마법의 엘리베이터 (0) | 2024.04.30 |
[JS] 메뉴 리뉴얼 (1) | 2024.04.16 |
[JS] 전력망을 둘로 나누기 (0) | 2024.04.09 |