function solution(weights) {
var answer = 0;
const hash = {};
const method = [1, 3/2, 4/3, 2];
weights.sort((x,y) => y - x);
weights.forEach((weight) => {
let temp;
for (const m of method) {
temp = weight * m;
answer += hash[temp] ? hash[temp] : 0;
}
hash[weight] ? hash[weight]++ : hash[weight] = 1;
})
return answer;
}
기존에는 조합과 조건문을 사용해서 풀이했지만 시간 초과가 발생해서 다른 방법을 찾던 중에 hash를 사용한 방법을 알게 되었습니다.
문제를 푸는 아이디어는 다음과 같습니다.
- weights를 정렬을 통해 내림차순으로 변경해줍니다.
- 각 몸무게에 나올 수 있는 경우의 수는 1, 3/2, 4/3, 2가 전부이므로 이를 각각 곱합니다.
- 곱한 값이 hash에 존재하면 hash값 만큼 answer에 더해줍니다.
- 현재 몸무게가 hash값에 존재하면 +1을 해주고 아니면 1로 저장해줍니다.
문제를 풀면서 헷갈렸던게 있는데 만약에 weights가 [100, 100]일 경우 정답은 1이 되지만 [100, 100, 100]일 경우 3이 되다는 것이였습니다.
생각해보니 같은 시소를 탈 때, A와 B가 왼쪽에 앉던 오른쪽에 앉던 상관 없으니 다른 사람들끼리만 타는 경우를 구해주면 되는걸로 이해했습니다.