알고리즘/이취코

[이취코] 알고리즘 유형별 기출문제: 그리디 - 5. 볼링공 고르기 (Python)

한비 2023. 7. 2. 21:51
반응형

5. 볼링공 고르기

문제

  • A, B 두 사람이 서로 무게가 다른 볼링공을 고르려고 한다. 총 N개의 볼링공이 있고 각 공에 무게가 적혀있으며 공의 번호는 1번부터 순서대로 부여된다. 같은 무게의 공이 여러 개 있을 수 있지만 서로 다른 공으로 간주한다. 볼링공의 무게는 1부터 M까지의 자연수 형태로 존재한다.
  • N개의 공의 무게가 각각 주어질 때, 두 사람이 볼링공을 고르는 경우의 수를 구하시오.

예시

  • N이 5고 M이 3이며 각각의 무게가 1 3 2 3 2일 때 각 공의 번호가 차례대로 1번부터 5번까지 부여된다. 이때 두 사람이 고를 수 있는 볼링공 번호의 조합을 구하면 다음과 같다.
    • (1, 2) / (1, 3) / (1, 4) / (1, 5) / (2, 3) / (2, 5) / (3, 4) / (4, 5) → 8가지
  • 5 3
  • 1 3 2 3 2 → 8
  • 8 5
  • 1 3 4 3 2 4 5 2 → 25

입출력 조건

  • 입력
    • 첫째 줄에 볼링공의 개수 N, 공의 최대 무게 M이 공백으로 구분되어 각각 자연수 형태로 주어진다. (1≤N≤1000, 1≤M≤10)
    • 둘째 줄에 각 볼링공의 무게 K가 공백으로 구분되어 순서대로 자연수 형태로 주어진다. (1≤K≤M)
  • 출력
    • 첫째 줄에 두 사람이 볼링공을 고르는 경우의 수를 출력한다.

풀이

1) 내 풀이

전체 경우의 수에서 A와 B가 고른 두 볼링공의 무게가 같은 경우의 수를 빼면 된다.

예시에서 주어진 5, 3 / 1, 3, 2, 3, 2의 경우 무게가 2인 공과 3인 공이 두 개씩 있으므로

전체 5C2 = 10에서 2C2 = 1을 두 번 제외해 총 8가지

counter 모듈을 써서 무게별 공의 수를 센 다음에 nC2 계산해서 빼기

# 그리디 - 5. 볼링공 고르기
import sys, collections
input = sys.stdin.readline
def nC2(n):
    return int(n*(n-1)/2)
n, m = map(int, input().split())
weight = list(map(int, input().split()))
cnt = collections.Counter(weight)
total = nC2(n)
for key, value in cnt.items():
    if value > 1:
        total -= nC2(value)
print(total)

 

2) 해설지 풀이

최대 무게가 10이기 때문에 따로 모듈을 사용하지 않고 단순 for문으로 무게별 공의 수를 센다. 이후 1부터 m까지 각 무게에 대해 가능한 경우의 수를 계산한다.

 

A가 무게가 i인 공을 골랐을 때 B가 고를 수 있는 공은 무게가 1~i인 공을 제외한 공이다.

즉 B는 무게가 i+1~m인 공을 고를 수 있다.

 

위와 동일하게 5, 3 / 1, 3, 2, 3, 2의 예시로 생각해 보았을 때,

A가 무게가 1인 공을 선택할 때 B가 고를 수 있는 공의 수는 4가지 (무게 2인 공 2개, 3인 공 2개)

A가 무게가 2인 공을 선택할 때 B가 고를 수 있는 공의 수는 2가지 (무게 3인 공 2개)

A가 무게가 3인 공을 선택할 때 B가 고를 수 있는 공의 수는 0가지

A가 고를 수 있는 공의 수 * B가 고를 수 있는 공의 수를 모두 더해 계산하면, 총 1 * 4 + 2 * 2 = 8가지 이다.

# 그리디 - 5. 볼링공 고르기
n, m = map(int, input().split())
weight = list(map(int, input().split()))
cnt = [0] * (m+1) # 무게별 공의 개수 저장할 배열
for x in weight:
    cnt[x] += 1
result = 0
for i in range(1, m):
    n -= cnt[i] # B가 선택할 수 있는 공의 수 (전체에서 무게가 1~i인 공의 수 제외)
    result += cnt[i] * n # A가 선택할 수 있는 공의 수(무게가 i인 공의 수) * B가 선택할 수 있는 공의 수
print(result)
반응형