-
백준 9375 파이썬 | 패션왕 신해빈알고리즘 BOJ 2021. 9. 2. 16:14
코드
from sys import stdin T = int(input()) for _ in range(T): n = int(input()) lst = {} ans = 1 for i in range(n): name, part = input().split() if part in lst: lst[part] += 1 else: lst[part] = 1 for p in lst: ans *= lst[p] + 1 ans -= 1 print(ans)
설명
해빈이가 입을 수 있는 서로 다른 옷 조합의 개수를 구해주는 문제이다. 고등학교 때 풀던 경우의 수 문제와 거의 똑같은 유형이다.
이 문제에서 주의해야 할 점은 옷을 입력 받을 때, 같은 부위의 옷을 어떻게 처리할 것인가 이다. 의상 이름이 무엇이냐는 전혀 중요하지 않고 어떤 부위에 입는 옷이냐만 중점으로 이용하면 된다. 부위마다 옷이 몇 개 있는지 숫자를 세야하기 때문에 딕셔너리 구조를 이용하였다. 예를 들어 hat headgear를 입력 받았다고 치자. 이 문장을 name 과 part로 분리해서 받아준다. 우리가 관심이 있는건 part 뿐이다. part에 headgear를 받았다. headgear가 딕셔너리에 있는지 파악하고, 없으면 딕셔너리에 {headgear: 1}로 추가해 준다. 만약 이미 headgear가 있으면 딕셔너리에 {headgear: 원래 있던 수 + 1} 하는 식으로 숫자를 하나 늘려준다. 반복문 n번 돌고 나면 무슨 부위의 옷이 몇 개 있는지 딕셔너리에 저장된다.
그 다음으로는 경우의 수를 구해주면 된다. 예를 들어 headgear 가 2개 있다고 해보자. 그럼 헤드기어에 대한 모든 경우의 수는 (입지 않는다, 헤드기어1, 헤드기어2)로 3개가 된다. 이렇게 모든 부위의 옷에 대해 개수 + 1 만큼 곱하면 전체 경우의 수가 나온다. 하지만 이 경우의 수에는 해빈이가 아무것도 입지 않은 알몸인 상태인 경우의 수가 하나 존재한다. 그래서 마지막에 경우의 수를 하나 뺴주면 그게 답이된다.
나는 처음에 9번째 줄 if part in lst: 를 if lst.__contains__(part)로 썼었는데 다른 사람 거 보니까 다 if part in lst: 이런식으로 썼더라. 이거 보고 나도 앞으로 if OO in LLL 이런식으로 써야겠다. if OO not in LLL 이런식으로도 쓸 수 있다.
메모리: 29200 KB
시간: 100 ms
문제
https://www.acmicpc.net/problem/9375
9375번: 패션왕 신해빈
첫 번째 테스트 케이스는 headgear에 해당하는 의상이 hat, turban이며 eyewear에 해당하는 의상이 sunglasses이므로 (hat), (turban), (sunglasses), (hat,sunglasses), (turban,sunglasses)로 총 5가지 이다.
www.acmicpc.net
'알고리즘 BOJ' 카테고리의 다른 글
백준 2630 파이썬 | 색종이 만들기 (0) 2021.09.02 백준 9095 파이썬 | 1, 2, 3 더하기 (0) 2021.09.02 백준 11727 파이썬 | 2xn 타일링 2 (0) 2021.09.02 백준 11726 파이썬 | 2xn 타일링 (0) 2021.09.02 백준 9461 파이썬 | 파도반 수열 (0) 2021.08.31