코딩 문제

백준 9375 - 패션왕 신해빈

토리쟁이 2022. 10. 10. 19:05

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