https://school.programmers.co.kr/learn/courses/30/lessons/152996#
코드 & 풀이
from collections import Counter
def solution(weights):
answer = 0
weights_count = Counter(weights) # 각 무게의 등장 횟수 기록
# 동일한 무게끼리 짝꿍이 되는 경우
for weight, count in weights_count.items():
if count > 1:
answer += count * (count - 1) // 2 # 조합 계산
ratios = [(2, 3), (2, 4), (3, 4)]
for weight in weights_count:
for r1, r2 in ratios:
pair_weight = weight * r1 // r2
# 나누어떨어지는 경우와 해당 무게가 존재하는지 확인
if weight * r1 % r2 == 0 and pair_weight in weights_count:
answer += weights_count[weight] * weights_count[pair_weight]
return answer
시소의 중심으로부터 2, 3, 4 m 간격으로 자리가 있다.
이에 균형이 맞는 경우를 찾아야 한다.
1. weights의 각 무게의 등장 횟수를 기록합니다.
2. 같은 몸무게를 가진 사람들끼리 짝이 되는 경우를 체크합니다.
3. 거리 비율에 따라 균형을 이루는 경우를 찾습니다.
1. 몸무게 등장 횟수 기록
weights_count = Counter(weights)
or
weights_count = {}
for weight in weights:
weights_count[weight] = weights_count.get(weight, 0) + 1
2. 같은 몸무게와 짝을 이루는 경우
for weight, count in weights_count.items():
if count > 1:
answer += count * (count - 1) // 2
count * (count - 1) // 2는
조합의 수를 계산하기 위한 공식입니다.
같은 무게를 가진 사람이 count명일 때, 두 명을 선택하는 경우의 수는 C(count, 2)입니다.
예시:
weights = [100, 100, 100] 일때
- weights_count = {100: 3}
무게 100이 3번 등장합니다. - 조합 계산 : 조합 수 = (3 * (3 − 1)) / 2= (3 * 2) / 2 = 3
- 짝의 경우: (1번, 2번), (1번, 3번), (2번, 3번)
총 3개의 짝이 만들어집니다.
- 짝의 경우: (1번, 2번), (1번, 3번), (2번, 3번)
- answer += 3
3. 거리 비율에 따라 균형을 이루는 경우
ratios = [(2, 3), (2, 4), (3, 4)]
for weight in weights_count:
for r1, r2 in ratios:
pair_weight = weight * r1 // r2
if weight * r1 % r2 == 0 and pair_weight in weights_count:
answer += weights_count[weight] * weights_count[pair_weight]
rotios는 시소의 거리 비율,
2, 3, 4m 의 조합을 나타냅니다.
모든 거리 비율은 (2:3), (2:4), (3:4), (3:2), (4:2), (4:3) 이지만
(2:3), (2:4), (3:4)를 기준으로
반대의 경우, 즉 숫자의 위치가 바뀌면 같은 결과가 나오므로
저 3가지만 보면 됩니다.
이제 반복문의 조건문을 봅시다.
if weight * r1 % r2 == 0 and pair_weight in weights_count:
answer += weights_count[weight] * weights_count[pair_weight]
나누어떨어지는 경우와 해당 무게가 존재하는지 확인하는 겁니다.
- weight * r1 % r2 == 0
- 특정 무게 weight가 비율 r1:r2에서 균형을 이루기 위해 필요한 상대 무게가 정수인지 확인합니다.
- 조건이 만족되면, weight와 짝이 되는 무게가 pair_weight = weight * r1 // r2로 계산됩니다.
- pair_weight in weights_count
- 계산된 pair_weight가 입력된 무게 목록에 있는지 확인합니다.
- 있다면, 해당 무게 쌍이 시소 짝꿍을 이룰 수 있습니다.
- weights_count[weight] * weights_count[pair_weight]
- weight와 pair_weight의 빈도를 곱해서 해당 짝의 모든 가능한 조합 수를 더합니다.
728x90
'프로그래머스 > Lv.2' 카테고리의 다른 글
호텔 대실 - Pyton, 구현, 누적합, 스위핑(Sweeping), 힙(heap) (0) | 2024.12.22 |
---|---|
124 나라의 숫자 - 구현, 수학(?) (1) | 2024.12.20 |
마법의 엘리베이터 - Python, 구현 (1) | 2024.12.18 |
월간 코드 챌린지 시즌1 > 삼각 달팽이 - Python, 구현 (0) | 2024.12.17 |
연속된 부분 수열의 합 - Python, 부분합, 슬라이딩 윈도우 (0) | 2024.12.16 |