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

조유정·2023년 4월 14일
0

코딩테스트

목록 보기
29/31

[프로그래머스] 코딩테스트 연습 > 연습문제 > 시소 짝꿍

문제 설명

어느 공원 놀이터에는 시소가 하나 설치되어 있습니다. 이 시소는 중심으로부터 2(m), 3(m), 4(m) 거리의 지점에 좌석이 하나씩 있습니다.
이 시소를 두 명이 마주 보고 탄다고 할 때, 시소가 평형인 상태에서 각각에 의해 시소에 걸리는 토크의 크기가 서로 상쇄되어 완전한 균형을 이룰 수 있다면 그 두 사람을 시소 짝꿍이라고 합니다. 즉, 탑승한 사람의 무게와 시소 축과 좌석 간의 거리의 곱이 양쪽 다 같다면 시소 짝꿍이라고 할 수 있습니다.
사람들의 몸무게 목록 weights이 주어질 때, 시소 짝꿍이 몇 쌍 존재하는지 구하여 return 하도록 solution 함수를 완성해주세요.

제한 사항

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

입출력 예

weightsresult
[100,180,360,100,270]4

풀이

정말 간단해 보이는 문제인데 푸는데 너무 오래 걸렸다.
결국 인터넷을 참고하여 풀었다...

시간초과를 해결하는 것이 첫번째 관건이었다.
for문을 한번만 사용하여 해결해내야하는데, 그러기 위해서는 사전에 정렬하는 과정이 필요하다.

다음으로 조건을 설정하는 것이 두번째 관건이었다.
조건은 코드를 참조하셔요.

코드

import java.util.*;

class Solution {
    public long solution(int[] weights) {
        long answer = 0;

		Map<Double, Integer> map = new HashMap<>();
        Arrays.sort(weights);
		for(int weight : weights) {
			answer += helper(weight, map);
		}
		return answer;
    }
    
    public long helper(int w, Map<Double, Integer> map) {
		long answer = 0;
		double d1 = w*1.0;
		double d2 = (w*2.0)/3.0;
		double d3 = (w*1.0)/2.0;
		double d4 = (w*3.0)/4.0;
		if(map.containsKey(d1)) answer += map.get(d1);
		if(map.containsKey(d2)) answer += map.get(d2);
		if(map.containsKey(d3)) answer += map.get(d3);
		if(map.containsKey(d4)) answer += map.get(d4);
		map.put(w*1.0, map.getOrDefault(w*1.0, 0)+1);
		return answer;
	}
}
profile
나는 아직 멍청하다

0개의 댓글