어느 공원 놀이터에는 시소가 하나 설치되어 있습니다. 이 시소는 중심으로부터 2(m), 3(m), 4(m) 거리의 지점에 좌석이 하나씩 있습니다.
이 시소를 두 명이 마주 보고 탄다고 할 때, 시소가 평형인 상태에서 각각에 의해 시소에 걸리는 토크의 크기가 서로 상쇄되어 완전한 균형을 이룰 수 있다면 그 두 사람을 시소 짝꿍이라고 합니다. 즉, 탑승한 사람의 무게와 시소 축과 좌석 간의 거리의 곱이 양쪽 다 같다면 시소 짝꿍이라고 할 수 있습니다.
사람들의 몸무게 목록 weights 이 주어질 때, 시소 짝꿍이 몇 쌍 존재하는지 구하여 return 하도록 solution 함수를 완성해주세요.
구현 + 맵 자료구조를 이용해서 풀었다.
그리고 weights의 범위가 100,000이라서 무조건 반복은 한 번 돌아야 한다고 생각했다.
{100=[0, 3], 180=[1], 360=[2], 270=[4]}
이런식으로 데이터가 담긴다
weights 배열에서 중복을 제거한 set을 토대로 반복을 돌린다
반복 하면서 확인해줘야 할 것은 7가지이다. 표를 보며 쉽게 이해해보자
x2 | x3 | x4 | |
---|---|---|---|
x2 | 중복 | key x 2 ÷ 3 | key x 2 ÷ 4 |
x3 | key x 3 ÷ 2 | 중복 | key x 3 ÷ 4 |
x4 | key x 4 ÷ 2 | key x 4 ÷ 3 | 중복 |
중복 칸을 제외하고는 무조건 다른 값이 나오게 되어있다. 그래서 총 7가지만 비교해주면 된다.
반복을 돌면서, 예를들어 100의 몸무게에서 나올 수 있는 균형을 다 세고나면 맵에서 key 100을 삭제해준다. 앞으로 다시 체크할 필요가 없기 때문이다.
import java.util.*;
class Solution {
public long solution(int[] weights) {
long answer = 0;
Map<Integer, List<Integer> > hm = new HashMap<>();
Set<Integer> mySet = new HashSet<>();
int leng = weights.length;
for(int i = 0 ; i < leng; i++){
if(!hm.containsKey(weights[i])){
List<Integer> myList = new ArrayList<>();
myList.add(i);
hm.put(weights[i], myList);
}
else{
hm.get(weights[i]).add(i);
}
mySet.add(weights[i]);
}
for(int key : mySet){
int dupli = hm.get(key).size();
int wX2 = key * 2;
if(wX2 % 3 == 0) {
if(hm.containsKey(wX2 / 3)){
answer += (long)hm.get(wX2/3).size() * dupli;
}
}
if(wX2 % 4 == 0) {
if(hm.containsKey(wX2 /4)){
answer += (long)hm.get(wX2/ 4).size() * dupli;
}
}
int wX3 = key * 3;
if(wX3 % 2 == 0) {
if(hm.containsKey(wX3 / 2)){
answer += (long)hm.get(wX3/2).size() * dupli;
}
}
if(wX3 % 4 == 0) {
if(hm.containsKey(wX3 /4)){
answer += (long)hm.get(wX3/ 4).size() * dupli;
}
}
int wX4 = key * 4;
if(wX4 % 2 == 0) {
if(hm.containsKey(wX4 / 2)){
answer += (long)hm.get(wX4/2).size() * dupli;
}
}
if(wX4 % 3 == 0) {
if(hm.containsKey(wX4 /3)){
answer += (long)hm.get(wX4/ 3).size() * dupli;
}
}
if(dupli > 1){
answer += (long)dupli * (long)(dupli - 1) / 2;
}
hm.remove(key);
}
return answer;
}
}
(long) 을 잘못 적용해줘서 통과하기까지 꽤 오래 걸렸다. 기초에 충실하자…ㅠㅡㅠ
덕분에 좋은 내용 잘 보고 갑니다.
정말 감사합니다.