본문 바로가기

Baekjoon

[Baekjoon]백준 9375 패션왕 신해빈(실버 3) - Python

문제설명
예제

문제를 살펴보면 의상의 종류와 의상의 이름이 주어지고, 각 종류당 최대 하나씩을

선택하여 만들어지는 모든 조합의 수를 구하는 문제이다

이를 풀기 위해서는 조합과 딕셔너리를 활용하는 것이 좋을 것이라 생각하였다

딕셔너리는 키-값 쌍으로 데이터를 저장할 수 있으며, 키에는 문자열 등 해시 가능한 객체를 사용할 수 있다

이를 활용하여 의상의 종류를 키로 설정하고, 해당 종류에 속한 의상 이름들을 값으로 저장하는 방식으로 구현하였다

 

일단, 테스트 케이스를 입력받고, 그에 따라 반복문에 의해 입력이 반복된다

의상의 이름과 종류는 input().split()으로 분리하여 입력을 받고 만약 딕셔너리에 옷의 종류가 저장되어있다면

append()로 옷의 이름을 추가해주고, 만약 아니라면 새로 값을 저장해준다

경우의 수를 구하는 것은 모든 딕셔너리의 각 key값에 저장된 value를 서로 곱해주면 되는데,

각 옷을 입는 것뿐만 아니라 안 입는 경우도 존재하기 때문에 len(wear[key]) + 1을 서로 곱해주어야한다

해당 방법으로 구한 값은 모든 옷을 안 입은 경우도 포함되어있기 때문에 출력 직전에 -1을 해주면 된다

import sys
input = sys.stdin.readline

test_case = int(input())
for _ in range(test_case):
    wear_num = int(input())
    wear = {}
    for _ in range(wear_num):
        name, wear_type = input().split()
        if wear_type in wear:
            wear[wear_type].append(name)
        else:
            wear[wear_type] = [name]
            
    cnt = 1
    for i in wear:
        cnt *= (len(wear[i]) + 1)
    print(cnt-1)

조합과 딕셔너리 활용만 한다면 큰 어려움 없이 해결 가능하다