Coding Test/프로그래머스
[프로그래머스] 시소 짝꿍 - 자바
lsh2613
2023. 8. 4. 16:44
https://school.programmers.co.kr/learn/courses/30/lessons/152996
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 풀이
- weights의 최대 갯수는 100,000개로 나올 수 있는 쌍의 최대 개수는 모두가 쌍인 경우(10만 개가 모두 같은 값이라고 가정해보면 됨) 1+2+---+999,999개로 대략 50억개로 int형의 약 20억의 수를 가뿐히 넘는다. 따라서 answer를 long으로 바꿔준다
- 쌍의 순서는 무관하다. 즉 (a,b) , (b,a)는 같다. a의 쌍을 구해서 b를 카운트 했으면 b의 쌍을 구할 때는 a를 카운트 하면 안 된다는 뜻이다.
- 따라서 HashMap을 통해 weights를 차근차근 넣고 넣어진 값에서만 비교를 진행
- 비율 계산은 소수점을 그대로 유지. 시소 거리별 비율이 존재하는데 이 값은 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로 풀었다가 시간만 낭비했다.