본문 바로가기
프로그래머스/Lv.2

시소 짝꿍 - Pyton,

by 아찌방 2024. 12. 24.

 

 

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

코드 & 풀이

 

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] 일때

  1. weights_count = {100: 3}
    무게 100이 3번 등장합니다.
  2. 조합 계산 : 조합 수 = (3 * (3 − 1)) / 2= (3 * 2) / 2 = 3
    • 짝의 경우: (1번, 2번), (1번, 3번), (2번, 3번)
      총 3개의 짝이 만들어집니다.
  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