https://www.acmicpc.net/problem/9375
9375번: 패션왕 신해빈
첫 번째 테스트 케이스는 headgear에 해당하는 의상이 hat, turban이며 eyewear에 해당하는 의상이 sunglasses이므로 (hat), (turban), (sunglasses), (hat,sunglasses), (turban,sunglasses)로 총 5가지 이다.
www.acmicpc.net

문제 요약)
의상과 의상의 종류를 입력받아 같은 종류의 의상을 입는 것을 제외하여 의상을 입는 경우의 수를 구하는 문제
key point)
여러 의상들과 a, b, c ...등의 여러 의상 종류를 입력받았다고 가정해보자.
식을 세운다면 다음과 같이 세울 수 있다.
(a종류수 + 1) * (b종류수 + 1) * (c종류수 + 1)... - 1
여기서 종류수에 +1을 해준 이유는 그 종류의 의상을 착용해도 되고 안해도 되기 때문이고
마지막에 -1을 해준 이유는 모든 의상을 착용하지 않은 경우를 제외시켜줘야 하기 때문이다.
의상의 종류와 그 종류에 있는 의상 갯수를 세기 위해 딕셔너리를 이용하였다.
반복문을 이용해 직접 옷의 종류를 세어 딕셔너리에 넣어줘도 되지만, Collections 모듈의 Counter 함수를 임포트하여 간편하게 구현하였다.
from collections import Counter
T = int(input())
cat=[]
result = 1
total = {}
for i in range(T):
n = int(input())
for j in range(n):
a, b = input().split()
cat.append(b)
total = Counter(cat)
for k in total:
result *= (total[k]+1)
print(result-1)
result = 1
total={}
cat=[]
주의할 점)
총 T개의 테스트 케이스가 있으므로 하나의 테스트가 끝난 반복문의 끝에는 새로운 옷과 종류들을 입력받기 위해 각 리스트와 딕셔너리를 초기화하여야 한다.
2023.01.04 복습
조금 더 클린한 코드 풀이 추가
t = int(input())
for i in range(t):
n = int(input())
result = 1
ctgs = {}
for j in range(n):
name, ctg = input().split()
if ctg not in ctgs.keys():
ctgs[ctg] = 1
else:
ctgs[ctg] += 1
for j in ctgs.keys():
result *= ctgs[j]+1
print(result-1)
'코딩 문제' 카테고리의 다른 글
백준 15649 -N과 M (0) | 2022.10.12 |
---|---|
백준 1676- 팩토리얼 0의 개수, 2004- 조합 0의 개수 (0) | 2022.10.11 |
백준 1010 - 다리놓기 (0) | 2022.10.10 |
백준 11051 - 이항 계수2 (0) | 2022.10.07 |
백준 2981 - 검문 (0) | 2022.09.22 |