🧩 Algorithm/[Programmers] μ•Œκ³ λ¦¬μ¦˜ 고득점 KIT

[Programmers/μ•Œκ³ λ¦¬μ¦˜ 고득점 KIT] μ˜μƒ

devCloud 2026. 3. 21. 19:00
728x90

[Programmers] μ˜μƒ

Level 2 | #ν•΄μ‹œ #μ‘°ν•©

1. 문제 μš”μ•½

μŠ€νŒŒμ΄κ°€ κ°€μ§„ μ˜μƒλ“€μ΄ λ‹΄κΈ΄ 2차원 λ°°μ—΄ clothesκ°€ μ£Όμ–΄μ§ˆ λ•Œ, μ„œλ‘œ λ‹€λ₯Έ 옷의 μ‘°ν•©μ˜ 수λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œμ΄λ‹€.

각 μ’…λ₯˜λ³„λ‘œ μ΅œλŒ€ 1개의 μ˜μƒλ§Œ μ°©μš©ν•  수 있으며, μ΅œμ†Œ ν•œ 개의 μ˜μƒμ€ μž…μ–΄μ•Ό ν•œλ‹€.

2. 핡심 아이디어: "μ•ˆ μž…λŠ” 것도 선택이닀"

각 μ˜μƒ μ’…λ₯˜(머리μž₯식, μƒμ˜, ν•˜μ˜ λ“±)μ—μ„œ ν•˜λ‚˜λ₯Ό κ³ λ₯΄λŠ” 경우의 수 외에 '아무것도 μž…μ§€ μ•ŠλŠ” 경우'λ₯Ό 선택지에 μΆ”κ°€ν•˜λŠ” 것이 ν¬μΈνŠΈμ΄λ‹€.

예λ₯Ό λ“€μ–΄, 머리μž₯식이 [μ•ˆκ²½, μ„ κΈ€λΌμŠ€] 2개라면 μ„ νƒμ§€λŠ” 총 3κ°€μ§€κ°€ λœλ‹€.

  • μ•ˆκ²½μ„ μ“΄λ‹€.
  • μ„ κΈ€λΌμŠ€λ₯Ό μ“΄λ‹€.
  • 아무것도 μ“°μ§€ μ•ŠλŠ”λ‹€.

3. μˆ˜ν•™μ  곡식

(n + 1) × (m + 1) × (k + 1) ... − 1

πŸ“Œ +1을 ν•˜λŠ” 이유: ν•΄λ‹Ή μ’…λ₯˜μ˜ μ˜μƒμ„ ν•˜λ‚˜λ„ μž…μ§€ μ•ŠλŠ” 경우λ₯Ό ν¬ν•¨ν•˜κΈ° μœ„ν•΄μ„œμ΄λ‹€.

πŸ“Œ λ§ˆμ§€λ§‰μ— -1을 ν•˜λŠ” 이유: λͺ¨λ“  μ’…λ₯˜μ˜ μ˜μƒμ„ ν•˜λ‚˜λ„ μž…μ§€ μ•Šμ€ μƒνƒœ(μ΅œμ†Œ ν•œ 개의 μ˜μƒμ€ μž…μ–΄μ•Ό ν•œλ‹€λŠ” 쑰건 μœ„λ°°)λ₯Ό μ œμ™Έν•˜κΈ° μœ„ν•΄μ„œμ΄λ‹€.

4. κ΅¬ν˜„ μ½”λ“œ (Python)

from collections import defaultdict

def solution(clothes):
    # 1. μ˜μƒ μ’…λ₯˜λ³„λ‘œ 개수λ₯Ό μ„Όλ‹€
    closet = defaultdict(int)
    for name, kind in clothes:
        closet[kind] += 1
    
    # 2. λͺ¨λ“  경우의 수λ₯Ό κ³±ν•œλ‹€ (각 μ’…λ₯˜λ³„ 개수 + 1)
    answer = 1
    for count in closet.values():
        answer *= (count + 1)
    
    # 3. 아무것도 μž…μ§€ μ•Šμ€ 경우 1개λ₯Ό λΊ€λ‹€
    return answer - 1

πŸ“Œ defaultdict ν™œμš©: ν‚€μ˜ 쑴재 μ—¬λΆ€λ₯Ό 맀번 ν™•μΈν•˜μ§€ μ•Šκ³ λ„ μ˜μƒ μ’…λ₯˜λ³„ 개수λ₯Ό λ°”λ‘œ μΉ΄μš΄νŠΈν•  수 μžˆμ–΄ νŽΈλ¦¬ν•˜λ‹€.

πŸ“Œ μ‘°ν•© 계산: 각 μΉ΄ν…Œκ³ λ¦¬μ˜ 값을 κ³±ν•˜μ—¬ 전체 경우의 수λ₯Ό μ‚°μΆœν•œλ‹€.

728x90