코딩 테스트/프로그래머스

[프로그래머스] 시소 짝궁

sangjin98 2024. 3. 21. 23:36
반응형

문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 분석

[제한 사항]

  • 2 ≤ weights의 길이 ≤ 100,000
  • 100 ≤ weights[i] ≤ 1,000
    • 몸무게 단위는 N(뉴턴)으로 주어집니다.
    • 몸무게는 모두 정수입니다.

 

시소를 중심으로 2, 3, 4 미터 거리에 좌석이 있고 사람들의 몸무게가 주어 졌을 때 짝궁이 몇 쌍 존재하는 지 구하는 문제이다.

짝궁은 서로 마주 앉았을 때 시소가 균형을 이루는 경우 그 두 사람을 짝궁이라고 한다.

양쪽의 (시소 중심축과 좌석 사이의 거리 X 몸무게) 가 같은 경우 짝궁이다.

문제 접근

 

좌석의 수가 많지 않기 때문에 모든 경우의 수를 따질 수 있었다. 

 

예를들어 몸무게가 100 인 사람이 2번 자리에 앉았을 경우 짝궁 후보로 (100, 100 * 2/3, 100 * 2/4) 이렇게 3명이 된다.

같은 방법을 3번 자리에 앉았을 경우, 4번 자리에 앉았을 경우를 모두 따져 모든 후보를 찾을 수 있고 해당 후보가 해당 후보가 실제 존재한다면 짝궁 수를 늘리면 된다.

 

 모든 경우의 수를 따지면 총 9개가 나오지만 중복 되는 경우를 제거하면 1, 2/3, 2/4, 3/4 4가지 경우의 수가 남는다.

 

weights 배열의 크기가 10^5 이기 때문에 O(n^2) 으로는 풀지 못한다. 

Map 자료구조를 이용하여 한번에 스캔하면서 문제를 풀고 중복되는 무게를 처리하기 위해서 해당 무게가 몇번 등장했는지 횟수도 체크한다.

코드

import java.util.*;

class Solution {
    static final double[] partners = {1.0, 2.0 / 3, 2.0 / 4, 3.0 / 4};
    public long solution(int[] weights) {
        long answer =  0;

        Map<Double, Integer> map = new HashMap<>();

        Arrays.sort(weights);

        for(int weight : weights){
            for (double partner : partners) {
                partner *= weight;

                if(map.containsKey(partner)){
                    answer+=map.get(partner);
                }
            }
            map.put((double) weight, map.getOrDefault((double) weight, 0) + 1);
        }

        System.out.println(map);
        return answer;
    }
}
반응형