Coding Test/프로그래머스

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

lsh2613 2023. 8. 4. 16:44

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

 

프로그래머스

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

programmers.co.kr

문제 풀이

  1. weights의 최대 갯수는 100,000개로 나올 수 있는 쌍의 최대 개수는 모두가 쌍인 경우(10만 개가 모두 같은 값이라고 가정해보면 됨) 1+2+---+999,999개로 대략 50억개로 int형의 약 20억의 수를 가뿐히 넘는다. 따라서 answer를 long으로 바꿔준다
  2. 쌍의 순서는 무관하다. 즉 (a,b) , (b,a)는 같다. a의 쌍을 구해서 b를 카운트 했으면 b의 쌍을 구할 때는 a를 카운트 하면 안 된다는 뜻이다.
    • 따라서 HashMap을 통해 weights를 차근차근 넣고 넣어진 값에서만 비교를 진행
  3. 비율 계산은 소수점을 그대로 유지. 시소 거리별 비율이 존재하는데 이 값은 int형이 아닌 소수점 그대로 double을 사용해야 한다.

코드

import java.util.*;

public class Solution {
    public long solution(int[] weights) {
        long answer = 0;
        Map<Double, Integer> info = new HashMap<>();
        
        for (int w : weights) {
            answer += info.getOrDefault(w*1.0, 0) +
                      info.getOrDefault(w * 2.0, 0) +
                      info.getOrDefault(w / 2.0, 0) +
                      info.getOrDefault(w * 2 / 3.0, 0) +
                      info.getOrDefault(w * 3 / 2.0, 0) +
                      info.getOrDefault(w * 4 / 3.0, 0) +
                      info.getOrDefault(w * 3 / 4.0, 0);
            
            info.put(w*1.0, info.getOrDefault(w*1.0, 0) + 1);
        }
        
        return answer;
    }
}

 

느낀점

문제 조건을 좀 자세히 써줬으면 삽질을 덜 했을 것 같다.

예시에서도 int값으로 딱 떨어져있어서 처음에 Map도 Integer로 풀었다가 시간만 낭비했다.