문제/프로그래머스

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

icodesiuuuu 2024. 11. 18. 18:16

문제

https://school.programmers.co.kr/learn/courses/30/lessons/152996

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 


 

문제 설명

어느 공원 놀이터에는 시소가 하나 설치되어 있습니다. 이 시소는 중심으로부터 각각 2(m), 3(m), 4(m) 거리의 지점에 좌석이 하나씩 설치되어 있습니다. 두 명의 사람이 마주 보고 시소에 앉았을 때, 시소가 평형 상태를 유지하려면 양쪽에 작용하는 토크의 크기가 같아야 합니다. 즉, 각 사람의 무게와 시소 축과의 거리의 곱이 동일하다면, 두 사람은 "시소 짝꿍"이라고 할 수 있습니다.

주어진 문제는 사람들의 몸무게 목록 weights가 주어졌을 때, 시소 짝꿍이 되는 쌍의 개수를 구하는 것입니다.

문제 접근 방법

문제를 해결하기 위해 우리는 몸무게의 비율과 시소의 각 거리를 활용하여 가능한 시소 짝꿍을 찾을 수 있습니다. 주어진 몸무게가 서로 다른 거리에서 균형을 맞출 수 있는지를 판단하여 가능한 짝꿍의 개수를 계산합니다. 이를 위해 효율적인 탐색을 위해 HashMap을 활용하여 이미 탐색된 무게를 저장하고 사용합니다.

코드 설명

  • weights 배열을 정렬하여 탐색의 효율성을 높였습니다.
  • HashMap을 이용해 탐색된 각 무게의 비율을 저장했습니다.
  • 각 무게에 대해 가능한 비율을 계산하고, 이미 탐색된 비율이 존재하면 해당 쌍의 개수를 answer에 더했습니다.
  • 비율 계산은 시소의 중심 거리 차이에 따라 무게의 상대 비율을 고려해 수행했습니다.
import java.util.*;

class Solution {
    public long solution(int[] weights) {
        long answer = 0;
        Arrays.sort(weights); // 몸무게를 정렬하여 탐색의 효율성을 높임
        Map<Double, Integer> map = new HashMap<>();
        
        // 각 무게에 대해 특정 비율을 계산하고, 기존의 값이 존재하면 해당 값만큼 카운트 증가
        for(int n : weights) {
            double a = n * 1.0;
            double b = (n * 1.0) / 2.0;
            double c = (n * 2.0) / 3.0;
            double d = (n * 3.0) / 4.0;
            
            if(map.containsKey(a)) answer += map.get(a);
            if(map.containsKey(b)) answer += map.get(b);
            if(map.containsKey(c)) answer += map.get(c);
            if(map.containsKey(d)) answer += map.get(d);
            
            // 현재 무게를 맵에 추가 또는 업데이트
            map.put(a, map.getOrDefault(a, 0) + 1);
        }
        
        return answer;
    }
}