STUDY/알고리즘
[프로그래머스] 위장 (Python)
seonyounggg
2021. 4. 18. 13:09
✏️ 문제
코딩테스트 연습 - 위장
programmers.co.kr
✏️ 풀이
종류를 Key, 이름 배열을 Value로 딕셔너리에 저장한다.
그 후, 고를 수 있는 모든 경우의 수를 계산한다.
✏️ 코드
from collections import defaultdict
from itertools import combinations
def solution(clothes):
answer = 0
clothes_dict = defaultdict(list)
for name, kind in clothes:
clothes_dict[kind].append(name)
keys = clothes_dict.keys()
for n in range(1, len(clothes_dict)+1):
for combi in combinations(keys, n):
case = 1
for key in combi:
case*=len(clothes_dict[key])
answer += case
return answer
1차 풀이에서는 이름을 1개~N개 고르는 모든 조합에 대해 각각의 경우의 수를 정답에 누적해서 더하는 식으로 풀이하였다.
테스트케이스 28개 중에 27개는 통과, 1개는 시간초과가 났다.
from collections import defaultdict
def solution(clothes):
answer = 1
clothes_dict = defaultdict(list)
for name, kind in clothes:
clothes_dict[kind].append(name)
for key in clothes_dict.keys():
case = len(clothes_dict[key]) + 1
answer *= case
answer -= 1
return answer
하나의 종류에 대한 경우의 수 = 해당 종류 중 하나를 고르는 경우의 수 N + 해당 종류를 고르지 않는 경우의 수 1 이다.
따라서 key에 대해 value 배열 길이 + 1 을 누적해서 곱해준다.
마지막에는 아무것도 고르지 않는 경우에 해당하는 1을 빼준다.
✏️ 생각
해쉬문제보단 수학(조합)문제에 가까운 듯 하다.
물론 종류별로 저장하려면 딕셔너리가 가장 효율적이긴 하지만...