백준 알고리즘

백준 - 9375번 패션왕 신해빈 python 문제풀이 [Hellfer]

Hellfer 2023. 12. 15. 16:30
728x90

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를 출력합니다.

 

🤗파이팅입니다~ 여러분!!🤗

 

728x90