프로그래머스 코딩테스트 고득점 Kit_해시_위장

Minhee kang·2021년 7월 27일
0

문제 보러 가기 👈 클릭!

💡 풀이

✔ 풀이 방법

다음과 같이 옷을 가지고 있다고 가정하자.

머리 : [썬글라스, 가발], 상의: [검정옷, 파란옷, 하얀옷], 하의: [청바지, 반바지, 치마]

머리 : 총 개수 + 아무것도 안하는 경우 = 2 + 1 = 3
상의 : 총 개수 + 아무것도 안하는 경우 = 3 + 1 = 4
하의 : 총 개수 + 아무것도 안하는 경우 = 3 + 1 = 4

총 경우의 수 = 3 X 4 X 4 라고 생각하기 쉽지만, 적어도 하나의 옷은 입어야 하므로 모두 입지 않는 경우를 빼줘야 한다.

총 경우의 수 = 3 X 4 X 4 - 1 = 48 - 1 = 47가지

구현 코드👇

def solution(clothes):
    
    #part_n_dict = {부위 : 옷 개수 + 1, ....}
    #1을 더하는 이유는 해당 부위의 옷을 안입는 경우를 포함하기 위함
    part_n_dict = dict()
    for cl, part in clothes:
        part_n_dict[part] = part_n_dict.get(part, 1) + 1
        
    answer = 1
    for n in part_n_dict.values():
        answer *= n

    #최소 한 개의 의상은 입어야하기 때문에 전체 케이스 중 모든 옷을 안입는 경우를 빼줌
    return answer-1

모듈을 사용하여 간단하게 구현한 코드👇

from collections import Counter
from functools import reduce

def solution(clothes):
    
    clothes_dic = Counter([part for cl, part in clothes])
    answer = reduce(lambda acc,cur: acc*(cur + 1), clothes_dic.values(), 1) - 1
    
    return answer

📝 처음에 생각했던 방법은 itertools.combinations모듈을 이용하여 모든 경우의 수를 세는 방법이였다. 이 방법은 테스트1에서 실패(시간초과)가 나왔다. 앞으로 경우의 수 문제를 풀 땐, 더 간단한 방법이 없는지 여러번 체크하자😠

0개의 댓글