1. 문제 풀이 아이디어
- 몸무게 목록의 범위가 좁은 점을 활용하여, 배열에 각 몸무게의 중복 개수를 저장해 문제를 해결한다.
2. 나의 정답 코드
class Solution {
public long solution(int[] weights) {
long answer = 0;
Set<Integer> set = new TreeSet<>();
long[] w = new long[1001];
for (int i = 0; i < weights.length; i++) {
set.add(weights[i]);
w[weights[i]]++;
}
for (int i : set) {
answer += w[i] * (w[i] - 1) / 2;
if (i * 4 / 3 > 1000) continue;
if (i % 3 == 0)
answer += w[i] * w[i * 4 / 3];
if (i * 3 / 2 > 1000) continue;
if (i % 2 == 0)
answer += w[i] * w[i * 3 / 2];
if (i * 2 > 1000) continue;
answer += w[i] * w[i * 2];
}
return answer;
}
}
3. 정리
weights
배열을 순회하며set
에 고유한 몸무게를 저장하고,w
배열에서 해당 몸무게의 개수를 증가시킨다.
set
을 순회하며 동일한 몸무게 짝궁, 그리고 비율이 4:3, 3:2, 2:1인 짝궁의 경우의 수를 계산하여answer
에 더한다.
- 범위를 초과하는 경우를 미리 검사해 효율적으로 처리한다.
Share article