민규의 흔적

[Python 파이썬] 프로그래머스 - 의상 본문

프로그래머스

[Python 파이썬] 프로그래머스 - 의상

민규링 2024. 6. 22. 13:04

2024년 6월 22일

문제 링크 : 프로그래머스 - 의상


문제 접근

 

각 카테고리의 옷은 0 ~ 1 가지 입을 수 있으며, 최소한 하나라도 입는 옷 코디 조합을 구하는 것이다.

단, 모든 옷을 0개 입는(아무것도 입지 않는) 경우는 코디 조합에 포함시키지 않아야 한다.

 

문제를 보자마자 딕셔너리로 카테고리별 옷들의 종류를 구분해주어야 겠다고 생각했다.

 

그러면 각 카테고리별로 옷이 몇 가지 씩 있는지 알 수 있는데, 단 해당 카테고리의 옷을 안입는다는 전제도 포함해야 하므로 공백문자("")또한 각 카테고리별로 추가해주었다.

 

우리는 여기서 가짓 수를 조합하는 공식을 떠올릴 수 있다.

 

A개의 상의와 B개의 하의와 C개의 신발을 입는 서로 다른 코디의 종류는 A * B * C 이다.

하지만 여기서는 안 입는 조건도 생각해야 하므로, (A + 1) * (B + 1) * (C + 1) 이다.

하지만! 아무것도 입지 않는 경우는 제외해야 하므로 위 결과값에서 1을 빼주어야 한다.

 


전체 코드

 

def solution(clothes):
    answer = 1

    dict = {}
    categories = []

    for c, category in clothes:
        if category not in dict:
            dict[category] = ["", c]
            categories.append(category)
        else:
            dict[category].append(c)

    for _, value in dict.items():
        answer *= len(value)

    # 아무것도 안 입는 조합은 빼야함
    return answer - 1

if __name__ == "__main__":
    clothes = [["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]]
    print(solution(clothes))

풀이 후기

 

풀고 나니 딕셔너리의 밸류로 옷 종류를 그대로 넣을 필요가 없다는 것을 깨달았다. 밸류에 그냥 해당 카테고리의 가짓수를 넣었다면 쪼오오금 더 효율적인 로직이었지 않을까 싶다.