import java.util.*;
public class Solution {
public long solution(int[] weights) {
long answer = 0;
HashMap<Integer,Long> map = new HashMap<>();
Set<Integer> mySet = new HashSet<>();
for(int i = 0; i < weights.length; i++) {
if(map.containsKey(weights[i])) {
map.put(weights[i], map.get(weights[i])+1);
}else {
map.put(weights[i],1L);
}
mySet.add(weights[i]);
}
for(int weight : mySet) {
long weightSize = map.get(weight);
int w = weight*2;
if(w%3 == 0 && map.containsKey(w/3)) {
answer += map.get(w/3)*weightSize;
}
if(w%4 == 0 && map.containsKey(w/4)) {
answer += map.get(w/4)*weightSize;
}
w = weight*3;
if(w%2 == 0 && map.containsKey(w/2)) {
answer += map.get(w/2)*weightSize;
}
if(w%4 == 0 && map.containsKey(w/4)) {
answer += map.get(w/4)*weightSize;
}
w = weight*4;
if(w%3 == 0 && map.containsKey(w/3)) {
answer += map.get(w/3)*weightSize;
}
if(w%2 == 0 && map.containsKey(w/2)) {
answer += map.get(w/2)*weightSize;
}
if(weightSize > 1) {
answer += weightSize*(weightSize-1)/2;
}
map.remove(weight);
}
return answer;
}
}
- 풀이
- 처음 제한사항을 보고 든 생각은 제한사항이 10만으로 반복문 한번에 해결해야 한다는 것이었다. 하지만 모든 몸무게의 조합을 구해야 한다는 것을 생각한다면 weights의 범위는 100~1000까지 많아야 900개로, map으로 counting을 해주면 된다는 것을 알 수 있다.
- 주의해야 할 점은 각 개수를 더할 때, 각 몸무게가 같은 경우와 아닌 경우를 다르게 계산해야 한다.
- 몸무게가 같은 경우 중복일 경우도 생각해서 N*(N-1)/2를 더해주어야 한다.
- 다른 경우 그냥 A의 개수*B의 개수를 해주면 된다.