문제 설명
어느 공원 놀이터에는 시소가 하나 설치되어 있습니다. 이 시소는 중심으로부터 2(m), 3(m), 4(m) 거리의 지점에 좌석이 하나씩 있습니다.
이 시소를 두 명이 마주 보고 탄다고 할 때, 시소가 평형인 상태에서 각각에 의해 시소에 걸리는 토크의 크기가 서로 상쇄되어 완전한 균형을 이룰 수 있다면 그 두 사람을 시소 짝꿍이라고 합니다. 즉, 탑승한 사람의 무게와 시소 축과 좌석 간의 거리의 곱이 양쪽 다 같다면 시소 짝꿍이라고 할 수 있습니다.
사람들의 몸무게 목록 weights이 주어질 때, 시소 짝꿍이 몇 쌍 존재하는지 구하여 return 하도록 solution 함수를 완성해주세요.
제한 사항
2 ≤ weights의 길이 ≤ 100,000
100 ≤ weights[i] ≤ 1,000
몸무게 단위는 N(뉴턴)으로 주어집니다.
몸무게는 모두 정수입니다.
제한사항이 중요한 문제 실제 길이는 100000이여서 이중 포문을 쓰면 엄청난 연산량이 필요하지만 weigths[i]의 값은 작기때문에 이 값으로 문제를 풀수 있는지를 묻는 문제였다.
추가적으로 integer의 범위를 넘어서는 map.get값이 나올수도있다 길이가 100000이기 때문에 최대값이 integer의 범위를 넘어서므로 형변환이 필요하다.
처음에는 최대공배수를 통해 값을 구해야한다 생각했는데 비율은 이미 정해져있어서 그렇게 중요하지는 않았다.
코드
import java.util.*;
class Solution {
public long solution(int[] weights) {
HashMap<Integer,Integer> map = new HashMap<>();
for(int i=0;i<weights.length;i++){
map.put(weights[i],map.getOrDefault(weights[i],0)+1);
}
long answer = 0;
for(int i: map.keySet()){
for(int j: map.keySet()){
if(i==j) continue;
if(i*2==j||i*3==j*2||i*4==j*3) answer+=(long)map.get(i)*map.get(j);
}
answer+=(long)map.get(i)*(map.get(i)-1)/2;
}
return answer;
}
}//최대공약수 문제?