문제 : https://school.programmers.co.kr/learn/courses/30/lessons/152996
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 풀이
n이 최대 100,000이라 완전탐색은 시간 초과이다.
두 사람 A(무게 a, 거리 da), B(무게 b, 거리 db)가 짝꿍이려면 [a * da = b * db]가 성립해야 한다. 더 가벼운 짝꿍만을 찾으면서 순회한다면 중복 없이 짝꿍이 성립하는 경우의 숫자를 찾을 수 있다. 더 가벼운 짝꿍을 찾는 거리 조합은 (2,3), (2,4), (3,4) 세 가지 이다.
몸무게가 같은 사람끼리는 무조건 시소 짝꿍이다. (nC2를 통해 따로 더해준다.)
작성한 코드
class Solution {
public long solution(int[] weights) {
long answer = 0;
// 해당 몸무게를 가진 사람 카운트 (100 ~ 1000)
int[] count = new int[1001];
for (int w : weights) {
count[w]++;
}
// 거리 조합 (더 가벼운 상대만 찾는다)
int[][] ratios = {{2, 3}, {2, 4}, {3, 4}};
for (int w = 100; w <= 1000; w++) {
if (count[w] == 0) continue;
// 같은 몸무게끼리 짝꿍이 되는 경우 (nC2)
long c = count[w];
answer += c * (c - 1) / 2;
// 더 가벼운 짝꿍을 찾는 경우
for (int[] r : ratios) {
int da = r[0], db = r[1];
// 짝꿍 = w * da / db
if ((long) w * da % db == 0) {
int partner = (int) ((long) w * da / db);
if (partner >= 100 && partner <= 1000) {
answer += (long) count[w] * count[partner];
}
}
}
}
return answer;
}
}
'자료구조 & 알고리즘 > 문제 풀이 (프로그래머스)' 카테고리의 다른 글
| 하노이의 탑 (재귀) (0) | 2026.07.24 |
|---|---|
| 테이블 해시 함수 (정렬, XOR) (0) | 2026.07.23 |
| 멀쩡한 사각형 (최대공약수) (0) | 2026.07.20 |
| 숫자 카드 나누기 (최대공약수) (0) | 2026.07.15 |
| 마법의 엘리베이터 (그리디 알고리즘) (0) | 2026.07.13 |
