[프로그래머스] 위장
2022. 2. 1. 20:56ㆍPython/코딩 문제
# 문제 설명
매일 다른 옷을 조합하여 입으려고 한다. 의상 정보들이 주어질 때, 가능한 의상 조합의 수를 반환해라.
각 의상 정보는 의상이름과 의상종류가 함께 주어진다. 같은 의상이름은 없으며, 하루에 최소 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
반응형
'Python > 코딩 문제' 카테고리의 다른 글
[리트코드] 17. Letter Combinations of a Phone Number (0) | 2022.02.01 |
---|---|
[리트코드] 46. Permutations (0) | 2022.02.01 |
[프로그래머스] 여행경로 (0) | 2022.02.01 |
[리트코드] 328. Odd Even Linked List (0) | 2022.01.18 |
[리트코드] 24. Swap Nodes in Pairs (0) | 2022.01.18 |