문제
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;
}
}
'문제 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 혼자 놀기의 달인 - Java (1) | 2024.11.20 |
---|---|
[프로그래머스] 혼자서 하는 틱택토 - Java (0) | 2024.11.19 |
[프로그래머스] 연속된 부분 수열의 합 - Java (0) | 2024.11.17 |
[프로그래머스] N-Queen - Java (0) | 2024.11.16 |
[프로그래머스] 거리두기 확인하기 - Java (1) | 2024.11.15 |