(프로그램 제작자)

문제 설명

매일 스파이는 자신을 변장하기 위해 다른 조합의 옷을 입습니다.

예를 들어 스파이가 다음과 같은 복장을 하고 있다면 어느 날은 동그란 안경, 긴 코트, 파란색 티셔츠를 입고 다음날 동그란 안경 대신 여분의 청바지나 검정색 선글라스를 착용해야 합니다.

유형 이름
얼굴 동그란 안경, 검은색 선글라스
맨 위 파란색 티셔츠
바지 청바지
코트 롱 코트

스파이가 입고 있는 옷을 포함하는 옷의 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

이 코드는 제가 독해력으로 작성한 코드를 최대한 보여줍니다.