문제 설명
매일 스파이는 자신을 변장하기 위해 다른 조합의 옷을 입습니다.
예를 들어 스파이가 다음과 같은 복장을 하고 있다면 어느 날은 동그란 안경, 긴 코트, 파란색 티셔츠를 입고 다음날 동그란 안경 대신 여분의 청바지나 검정색 선글라스를 착용해야 합니다.
유형 | 이름 |
얼굴 | 동그란 안경, 검은색 선글라스 |
맨 위 | 파란색 티셔츠 |
바지 | 청바지 |
코트 | 롱 코트 |
스파이가 입고 있는 옷을 포함하는 옷의 2D 배열이 주어졌을 때 옷의 다양한 조합 수를 반환하는 솔루션 함수를 작성하세요.
한계
- 옷의 각 행은 (옷 이름, 옷 종류)로 구성됩니다.
- 스파이는 1개 이상 30개 이하의 의상을 가질 수 있습니다.
- 같은 이름의 의상이 없습니다.
- 옷의 모든 요소는 로프로 만들어져 있습니다.
- 모든 문자열은 길이가 1에서 20 사이의 자연수이며 소문자 영문자 또는 “_”로만 구성됩니다.
- 스파이는 하루에 적어도 하나의 옷을 입습니다.
입력 및 출력 예
의류 | 반품 |
((“yellow_hat”, “headgear”), (“blue_sunglasses”, “eyewear”), (“green_turban”, “headgear”)) | 5 |
((“crow_mask”, “face”), (“blue_sunglasses”, “face”), (“smoky_makeup”, “face”)) | 삼 |
I/O 예시 설명
예 #1 헤드기어에 해당하는 옷은 yellow_hat과 green_turban이고, 안경에 해당하는 옷은 blue_sunglasses이므로 아래 그림과 같이 5가지 조합이 있을 수 있다.
1. yellow_hat
2. blue_sunglasses
3. green_turban
4. yellow_hat + blue_sunglasses
5. green_turban + blue_sunglasses
예 #2 얼굴에 해당하는 의상은 crow_mask, blue_sunglasses, smoke_makeup이므로 아래와 같이 3가지 조합이 가능합니다.
1. crow_mask
2. blue_sunglasses
3. smoky_makeup
문제를 풀다
# 해시
해결하는 과정
내 코드
해결 방법 1: 실패
def solution(clothes):
'''
'''
answer = 0
clothes_dict = {}
for name, type in clothes:
if type not in clothes_dict:
clothes_dict(type) = ()
clothes_dict(type).append(name)
else:
clothes_dict(type).append(name)
len_list = ()
for el in clothes_dict:
len_list.append(len(clothes_dict(el)))
mul = 1
for i in len_list:
mul *= i
if len(len_list) == 1:
answer = mul
else:
answer = mul + len(clothes)
return answer
키가 옷의 유형이고 값이 옷의 이름이 포함된 목록인 사전을 만든 다음 값을 삽입합니다.
처음에 생각한 해결책은 처음에 주어진 옷 목록을 각각 선택한 다음 유형별로 옷 목록의 길이의 곱을 더하는 것이었습니다. 하지만 한 종류의 옷만 있으면 해당되지 않으므로 예외 처리의 해당 부분만 테스트 케이스를 통과할 수 있습니다. 물론 답은 오답입니다.
옵션 2: 성공
def solution(clothes):
answer = 0
clothes_dict = {}
for name, type in clothes:
if type not in clothes_dict:
clothes_dict(type) = ()
clothes_dict(type).append(name)
else:
clothes_dict(type).append(name)
len_list = ()
for el in clothes_dict:
len_list.append(len(clothes_dict(el)))
mul = 1
for i in len_list:
mul *= i + 1
# if len(len_list) == 1:
# answer = mul
# else:
# answer = mul + len(clothes)
answer = mul - 1
return answer
그러고보니 종류별 옷 목록이 있으니 그걸 이용하세요.
예를 들어, 한 유형에 3벌의 옷이 있고, 한 유형에 2벌의 옷이 있는 경우, 3벌의 경우 4가지 경우가 있습니다(각 옷을 입었을 때 + 3벌을 입지 않은 경우). 의류는 피스가 3케이스이기 때문에 이 2개를 곱하면 모든 옷을 입을 수 있는 케이스의 수가 나옵니다.
하지만 물론 드레스를 입어야 한다는 조건이 있기 때문에 최종 결과에서 -1점을 주어야 합니다.
와 같은 많은 코드가 있습니다.
def solution(clothes):
from collections import Counter
from functools import reduce
cnt = Counter((kind for name, kind in clothes))
answer = reduce(lambda x, y: x*(y+1), cnt.values(), 1) - 1
return answer
이 코드는 제가 독해력으로 작성한 코드를 최대한 보여줍니다.