본문 바로가기
알고리즘 문제/Java

[프로그래머스/Java] 시소 짝꿍

by 현장 2026. 5. 6.

-Code

import java.util.*;

class Solution {
    public long solution(int[] weights) {
        long answer = 0;
        // 정렬해서 작은 수부터 검사
        Arrays.sort(weights);
        Map<Double, Long> weightsMap =
                new HashMap<>();
        for (int weight : weights) {
            // 각 배율에 따른 무게 구하기
            double base = weight;
            double ratio1 = weight * 2.0 / 3.0;
            double ratio2 = weight * 2.0 / 4.0;
            double ratio3 = weight * 3.0 / 4.0;
            // 각 비율에 따른 무게가 있는지 확인
            if (weightsMap.containsKey(base)) {
                // 나와 같은 무게가 있는지 확인
                answer += weightsMap.get(base);
            }
            // 이 아래로는 비율에 맞는 무게가 있는지 확인
            if (weightsMap.containsKey(ratio1)) {
                answer += weightsMap.get(ratio1);
            }
            if (weightsMap.containsKey(ratio2)) {
                answer += weightsMap.get(ratio2);
            }
            if (weightsMap.containsKey(ratio3)) {
                answer += weightsMap.get(ratio3);
            }
            // 현재 무게 추가 또는 횟수 증가
            weightsMap.put(
                base,
                weightsMap.getOrDefault(base, 0L) + 1
            );
        }
        return answer;
    }
}

처음에 2중 for문으로 해야 하나 하다가 범위를 보니 시간 초과가 생길 거 같아서 다른 방법을 찾아보았습니다.

Set이나 Map을 사용해야 할거같은데 찾아보니 Set의 문제는 같은 수가 들어갈 수 없어서 문제가 생기기 때문에 Map을 사용해야 한다는 것과 이때 값을 검사할 때마다 개수를 증가시켜서 계산해야 한다는 힌트를 얻어서 해결했습니다.

또한 정렬을 해주지 않으면 오름차순으로 검사하지 않기 때문에 문제가 생기기 때문에 조심한다는 것도 알게되었습니다.