[프로그래머스] 위장

2022. 2. 1. 20:56Python/코딩 문제

# 문제 설명

매일 다른 옷을 조합하여 입으려고 한다. 의상 정보들이 주어질 때, 가능한 의상 조합의 수를 반환해라.

각 의상 정보는 의상이름과 의상종류가 함께 주어진다. 같은 의상이름은 없으며, 하루에 최소 1개의 의상은 입는다.

 

# 입출력 예시

입력 출력
[["yellowhat", "headgear"], ["bluesunglasses", "eyewear"], ["green_turban", "headgear"]] 5
[["crowmask", "face"], ["bluesunglasses", "face"], ["smoky_makeup", "face"]]
3

 

# 코드 풀이

from collections import defaultdict

def solution(clothes):
    dic = defaultdict(set)
    for name, cate in clothes:
    	dic[cate].add(name)
    for k, v in dic.items(): # 선택 안하는 경우도 포함
    	dic[k].add("")
    
    answer = 1
    for x in dic.values(): # 선택지들
    	answer *= len(x)
    return answer - 1 # 최소 1개 입음

 

다른 풀이를 찾아보니, 논리는 같은데 자료구조 등이 더 최적화된 버전으로 가져왔다.

from collections import Counter
from functools import reduce

def solution(clothes):
    cnt = Counter([cate for _, cate in clothes]) # 카테고리 별 의상 수
    
    # reduce( fn(accum, x), x_list, accum_초기값)
    return reduce(lambda x, y: x * (y+1), cnt.values(), 1) - 1

 

 

# 핵심 포인트

- 주어진 입력 정보에서 필요한 것은 카테고리별 의상의 개수다.

- 선택을 하지 않는 경우도 포함하여, 1개나 2개 등을 입는 경우도 고려한다.

- reduce() 함수를 통해 누적하여 연산을 수행할 수 있다.

 

 

참고 : https://docs.python.org/3/library/functools.html?highlight=reduce#functools.reduce 

 

 

 

 

 

 

 

 

반응형