아 이 문제가 왜이렇게 어려웠을까...?
O(n)에 풀고싶었던 욕심이 너무 컸었나.. 계속 그쪽 풀이로 생각하다가 다른 생각이 막혀버린것 같다.
그러다가 시간이 좀 너무 지체되는거 같아서 가장 직관적인 방법이었던 이 방법으로 바로 풀긴했는데 그래도 아쉬움이 좀 많이 남는 풀이다.
import java.util.*;
class Solution {
public boolean isFriend(Integer f1, Integer f2) {
return (f1 * 2 == f2 * 3) || (f1 * 2 == f2 * 4 )|| (f1 * 3 == f2 * 2) || (f1 * 3 == f2 * 4) || (f1 * 4 == f2 * 2) || (f1 * 4 == f2 * 3);
}
public long solution(int[] weights) {
long answer = 0;
Map<Integer, Integer> wmap = new HashMap<>();
for(int weight : weights)
{
wmap.put(weight, wmap.getOrDefault(weight, 0) + 1);
}
Integer[] weight = wmap.keySet().toArray(new Integer[wmap.size()]);
Integer[] num = wmap.values().toArray(new Integer[wmap.size()]);
int i, j;
for(i = 0; i < weight.length - 1; i++) {
if(num[i] > 1) {
answer += (long) num[i] * (num[i] - 1) / 2;
}
for(j = i + 1; j < weight.length; j++) {
if(isFriend(weight[i], weight[j]))
{
answer += (long)num[i] * num[j];
}
}
}
if(num[i] > 1)
answer += (long) num[i] * (num[i] - 1) / 2;
return answer;
}
}