프로그래머스 해시

Treeboy·2025년 3월 3일
0

acmicpc

목록 보기
2/2

의상 (level 2)

문제

최소 1개 이상의 의상을 입는다고 할 때, 모든 의상의 조합을 구하는 문제이다. 한 종류에서는 하나의 의상만 입을 수 있다.

Solution

def solution(clothes):
    answer = 1
    
    # Construct hash out of the array
    myhash = {}
    for cloth, ctype in clothes:
        if ctype not in myhash.keys():
            myhash[ctype] = 0
        myhash[ctype] += 1
        
    # count combinations
    for key, item in myhash.items():
        answer *= item + 1
        
    answer -= 1
    return answer

해설

조합 문제이다.

i=1n(ai+1)1\prod_{i=1}^{n}(a_i+1) - 1

이 공식만 알면 풀 수 있는데... (얼굴 종류 + 1) (상의 종류 + 1) ... (겉옷 종류 + 1) - 1

이 공식을 몰라서 1개를 고를때, 2개를 고를 때, 3개를 고를 때... 이렇게 나눠서 푸려고 하다가 결국 힌트를 봤다. 결국 챗지피티에게 이 공식이 어떻게 나오는지 유도해달라고 했다.

챗지피티 해설

이 식의 전개와 해석은 다항식의 곱셈 원리를 활용한 조합론적 전개와 같습니다.

예를 들어, nn개의 의상 종류가 있고 각 종류 ii 마다 aia_i개의 의상이 있다고 합시다. 그러면 각 종류에 대해 선택의 경우의 수는

ai+1(실제 의상을 선택하는 ai가지 경우 + 선택하지 않는 경우 1가지)a_i + 1 \quad (\text{실제 의상을 선택하는 } a_i \text{가지 경우 + 선택하지 않는 경우 } 1 \text{가지})

따라서 모든 종류에 대해 독립적인 선택의 경우의 수는

i=1n(ai+1)\prod_{i=1}^{n} (a_i+1)

가 됩니다.

이 곱을 전개하면 다음과 같이 표현할 수 있습니다:

i=1n(ai+1)=(a1+1)(a2+1)(an+1)\prod_{i=1}^{n} (a_i+1) = (a_1+1)(a_2+1)\cdots(a_n+1)

각 괄호에서 aia_i 또는 11을 선택하는 것과 동일합니다.
즉, 전개 결과의 각 항은 ii번째 항에서 aia_i를 선택했는지, 아니면 11 (즉, 선택하지 않음)을 선택했는지에 따라 결정됩니다.
구체적으로, 전개 결과는 모든 부분집합 S{1,2,,n}S \subseteq \{1, 2, \dots, n\}에 대해

iSai\prod_{i\in S} a_i

의 항들의 합으로 나타납니다.

  • 만약 SS가 공집합이면, 이 항은 iai=1\prod_{i\in \emptyset} a_i = 1 (아무것도 선택하지 않은 경우)입니다.
  • SS가 단일 원소 집합, 예를 들어 {i}\{i\}라면, 해당 항은 aia_i가 되어 이는 오직 한 종류만 선택한 경우의 수를 의미합니다.
  • SS가 두 원소 집합 {i,j}\{i,j\}이면, 해당 항은 ai×aja_i \times a_j가 되어 두 종류를 모두 선택하는 경우의 수가 됩니다.
  • 모든 종류 {1,2,,n}\{1, 2, \dots, n\}를 선택하면 항은 i=1nai\prod_{i=1}^{n} a_i가 됩니다.

따라서, 전개하면 다음과 같이 쓸 수 있습니다:

i=1n(ai+1)=1아무것도 선택하지 않는 경우+i=1nai+1i<jnaiaj++i=1nai\prod_{i=1}^{n} (a_i+1) = \underbrace{1}_{\substack{\text{아무것도 선택하지 않는 경우}}} + \sum_{i=1}^{n} a_i + \sum_{1 \le i < j \le n} a_i a_j + \cdots + \prod_{i=1}^{n} a_i

여기서

  • i=1nai\sum_{i=1}^{n} a_i는 1개의 의상 종류만 선택한 경우들의 수,
  • 1i<jnaiaj\sum_{1 \le i < j \le n} a_i a_j는 2개의 의상 종류를 선택한 경우들의 수,
  • ...
  • i=1nai\prod_{i=1}^{n} a_i는 3개, 4개, …, nn개 모두 선택한 경우의 수를 의미합니다.

문제에서는 하루에 최소 한 개의 의상을 입어야 하므로, 공집합에 해당하는 11 (아무것도 선택하지 않는 경우)를 제외해주면 최종 경우의 수는

i=1n(ai+1)1\prod_{i=1}^{n} (a_i+1) - 1

가 됩니다.

이것이 바로 "1개의 의상 종류를 골라야 하는 경우, 2개의 의상 종류를 골라야 하는 경우, …, n개의 의상 종류를 모두 골라야 하는 경우의 수의 합"이 i=1n(ai+1)1\prod_{i=1}^{n} (a_i+1) - 1 로 표현되는 이유입니다.

0개의 댓글