백준 - 9375번 패션왕 신해빈 python 문제풀이 [Hellfer]
https://www.acmicpc.net/problem/9375
9375번: 패션왕 신해빈
첫 번째 테스트 케이스는 headgear에 해당하는 의상이 hat, turban이며 eyewear에 해당하는 의상이 sunglasses이므로 (hat), (turban), (sunglasses), (hat,sunglasses), (turban,sunglasses)로 총 5가지 이다.
www.acmicpc.net
🔷 알고리즘 분류 - 해시를 사용한 집합과 맵, 파싱
난이도 - 실버 3
1. len() 함수:
len(dictionary) 형태로 사용되며, 딕셔너리의 요소 개수를 반환합니다.
my_dict = {'apple': 3, 'banana': 5, 'orange': 2}
print(len(my_dict)) # 출력: 3
2. keys() 메서드:
dictionary.keys() 형태로 사용되며, 딕셔너리의 모든 키를 반환하는 뷰(view) 객체를 반환합니다.
my_dict = {'apple': 3, 'banana': 5, 'orange': 2}
keys = my_dict.keys()
print(keys) # 출력: dict_keys(['apple', 'banana', 'orange'])
3. values() 메서드:
dictionary.values() 형태로 사용되며, 딕셔너리의 모든 값들을 반환하는 뷰(view) 객체를 반환합니다.
my_dict = {'apple': 3, 'banana': 5, 'orange': 2}
values = my_dict.values()
print(values) # 출력: dict_values([3, 5, 2])
4. items() 메서드:
dictionary.items() 형태로 사용되며, 딕셔너리의 모든 키-값 쌍을 반환하는 뷰(view) 객체를 반환합니다.
my_dict = {'apple': 3, 'banana': 5, 'orange': 2}
items = my_dict.items()
print(items) # 출력: dict_items([('apple', 3), ('banana', 5), ('orange', 2)])
5. get() 메서드:
dictionary.get(key) 형태로 사용되며, 주어진 키에 해당하는 값을 반환합니다. 키가 존재하지 않을 경우에는 None을 반환하거나, 기본값을 설정하여 반환할 수도 있습니다.
my_dict = {'apple': 3, 'banana': 5, 'orange': 2}
print(my_dict.get('apple')) # 출력: 3
print(my_dict.get('grape')) # 출력: None
print(my_dict.get('grape', 0)) # 출력: 0 (기본값으로 0을 반환)
🔶 문제 풀이 - 딕셔너리를 이용한 풀이
n = int(input()) # 테스트 케이스의 개수를 입력받습니다.
for _ in range(n):
m = int(input()) # 각 테스트 케이스에서의 옷의 종류 개수를 입력받습니다.
dict = {} # 각 종류별로 개수를 저장할 딕셔너리를 초기화합니다.
for _ in range(m):
x, y = input().split() # 각 옷의 종류와 이름을 입력받습니다.
if y in dict:
dict[y] += 1 # 이미 딕셔너리에 종류가 있으면 개수를 1 증가시킵니다.
else:
dict[y] = 1 # 딕셔너리에 종류가 없으면 개수를 1로 초기화합니다.
result = 1
for i in dict.values():
result *= (i + 1) # 각 종류별 개수에 1을 더한 값을 곱해나갑니다.
result -= 1 # 아무것도 선택하지 않은 경우를 제외합니다.
print(result) # 결과를 출력합니다.
🔶문제 이해하기
예를 들어, 다음과 같은 입력이 주어진다고 가정해 보겠습니다.
3
2
hat headgear
sunglasses eyewear
3
mask face
sunglasses face
makeup face
2
turban headgear
hat headgea
if y in dict:
dict[y] += 1 # 이미 딕셔너리에 종류가 있으면 개수를 1 증가시킵니다.
else:
dict[y] = 1 # 딕셔너리에 종류가 없으면 개수를 1로 초기화합니다.
첫 번째 예시인 {'hat':'headgear', 'sunglasses':'eyewear'}를 살펴보겠습니다.
'headgear'의 경우 딕셔너리에 종류가 없으므로 개수를 1로 초기화합니다.
'eyewear'의 경우 딕셔너리에 종류가 없으므로 개수를 1로 초기화합니다.
result = 1
for i in dict.values():
result *= (i + 1) # 각 종류별 개수에 1을 더한 값을 곱해나갑니다.
result -= 1 # 아무것도 선택하지 않은 경우를 제외합니다.
print(result) # 결과를 출력합니다.
초기 result 값은 1이며 dict.values() 함수는 키 - 값으로 이루어진 딕셔너리에서 모든 값을 호출하는 함수입니다.
dict = {'headgear': 1, 'eyewear': 1}에서 출력값은 dict([1, 1]) 을 호출하게 됩니다.
for 문을 돌면서 result *= (i+1)을 계산합니다.
1. result *= 2, result = 2
2. result *= 2, result = 4 따라서 result는 4가 됩니다.
3. 아무것도 선택하지 않는 경우를 제외하여 최종적으로 result는 3이 됩니다.
4. 출력값으로 3을 출력합니다.
두 번째 예시인 {'mask':'face', 'sunglasses':'face', 'makeup':'face' }를 살펴보겠습니다.
'face'의 경우 딕셔너리에 종류가 없으므로 개수를 1로 초기화합니다.
'face'의 경우 딕셔너리 안에 존재하므로 개수를 1 증가시킵니다.
'face'의 경우 딕셔너리 안에 존재하므로 개수를 1 증가시킵니다.
dict = {'face': 3}에서 출력값은 dict([3]) 을 호출하게 됩니다.
for 문을 돌면서 result *= (i+1)을 계산합니다.
1. result *= 4, result = 4
2. 아무것도 선택하지 않는 경우를 제외하여 최종적으로 result는 3이 됩니다.
4. 출력값으로 3을 출력합니다.
세 번째 예시인 {'turban':'headgear', 'hat':'headgear'}를 살펴보겠습니다.
'headgear'의 경우 딕셔너리에 종류가 없으므로 개수를 1로 초기화합니다.
'headgear'의 경우 딕셔너리 안에 존재하므로 개수를 1 증가시킵니다.
dict = {'headgear': 2}에서 출력값은 dict([2]) 을 호출하게 됩니다.
for 문을 돌면서 result *= (i+1)을 계산합니다.
1. result *= 3, result = 3
2. 아무것도 선택하지 않는 경우를 제외하여 최종적으로 result는 2가 됩니다.
4. 출력값으로 2를 출력합니다.
🤗파이팅입니다~ 여러분!!🤗