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)
'알고리즘 > 이취코' 카테고리의 다른 글
[이취코] 알고리즘 유형별 기출문제: 구현 - 7. 럭키 스트레이트 (Python) (0) | 2023.07.03 |
---|---|
[이취코] 알고리즘 유형별 기출문제: 그리디 - 6. 무지의 먹방 라이브 (Python) (0) | 2023.07.02 |
[이취코] 알고리즘 유형별 기출문제: 그리디 - 4. 만들 수 없는 금액 (Python) (0) | 2023.06.29 |
[이취코] 알고리즘 유형별 기출문제: 그리디 - 3. 문자열 뒤집기 (Python) (0) | 2023.06.29 |
[이취코] 알고리즘 유형별 기출문제: 그리디 - 2. 곱하기 혹은 더하기 (Python) (0) | 2023.06.28 |