기록

[programmers/python] 의상 - collections.Counter 본문

코딩테스트/python

[programmers/python] 의상 - collections.Counter

zyin 2025. 5. 24. 22:22

문제

- url : https://school.programmers.co.kr/learn/courses/30/parts/12077

얼굴 동그란 안경, 검정 선글라스
상의 파란색 티셔츠
하의 청바지
겉옷 긴 코트

 

위처럼 여러 의상 종류가 있고 각 종류별로 여러 개의 아이템이 존재할 수 있다. 각 종류에서 한 가지씩만 착용 가능하며, 입거나 안 입을 수 있다. 단, 아무것도 입지 않는 경우는 제외한다.


접근 방식

이 문제는 조합의 수를 묻고 있지만, 단순한 조합이 아닌 종류별 선택의 경우의 수를 곱해서 구하는 방식으로 해결할 수 있다.

종류가 N개일 때:

(종류1 개수 + 1) × (종류2 개수 + 1) × ⋯ × (종류N 개수 + 1) - 1

 

여기서 +1은 해당 종류의 옷을 "입지 않는 경우"를 포함한 것이다.

마지막에 -1을 하는 이유는 전부 안 입는 경우(공집합)를 제외하기 위함이다.


Python 코드

from collections import Counter

def solution(clothes):
    _counter = Counter([kind for _, kind in clothes])
    
    ans = 1
    for i in _counter.values():
        ans *= (i + 1)
    
    return ans - 1

설명

  1. Counter를 통해 각 종류별 의상 개수를 구한다.
  2. 각 종류에서 (의상 수 + 1)만큼의 선택지를 가진다.
    • 예: 얼굴(2개) → [선택1, 선택2, 안 입음] → 3가지
  3. 모든 종류의 선택지를 곱한다.
  4. 아무것도 입지 않는 조합을 제외하기 위해 마지막에 1을 뺀다.

예시

solution([
    ["yellow_hat", "headgear"],
    ["blue_sunglasses", "eyewear"],
    ["green_turban", "headgear"]
])
# 출력: 5
  • headgear: 2개 → 3가지 선택 (2 + 1)
  • eyewear: 1개 → 2가지 선택 (1 + 1)
  • 전체 조합: 3 × 2 = 6 → 전부 안 입는 경우 제외 → 6 - 1 = 5
Comments