๐Ÿ’ซ ETC/Problem Solving

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์˜์ƒ

ming412 2023. 9. 25. 00:29

https://school.programmers.co.kr/learn/courses/30/lessons/42578

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

โœ๏ธ ๋ฌธ์ œ ์š”์•ฝ

- `clothes` ๋ฐฐ์—ด์„ ํ†ตํ•ด ์ฝ”๋‹ˆ๊ฐ€ ๊ฐ€์ง„ ์•„์ดํ…œ(=์˜์ƒ)์˜ [์ด๋ฆ„, ์ข…๋ฅ˜]์ด ์ฃผ์–ด์ง„๋‹ค.

- ์˜ˆ๋ฅผ ๋“ค์–ด, `clothes = [["A", "headgear"], ["B", "headgear"], ["C", "eyewear"], ["D", "eyewear"]]` ์ด๋ผ๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ์ข…๋ฅ˜์˜ headgear์™€ eyewear๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

- ๊ฐ™์€ ์ข…๋ฅ˜์˜ ์•„์ดํ…œ์€ ํ•˜๋‚˜๋งŒ ์ฐฉ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    - `A`์™€ `B`๋Š” ๋™์‹œ์— ์ฐฉ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

- ์ฐฉ์šฉํ•œ ์•„์ดํ…œ์˜ ์ผ๋ถ€๊ฐ€ ๊ฒน์น˜๋”๋ผ๋„, ๋‹ค๋ฅธ ์•„์ดํ…œ์ด ๊ฒน์น˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ถ”๊ฐ€ ์•„์ดํ…œ์„ ์ฐฉ์šฉํ•œ ๊ฒฝ์šฐ์—๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ณ„์‚ฐํ•œ๋‹ค.

    - ์˜ˆ๋ฅผ ๋“ค์–ด, `A` ์™€ `A, C`๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ์ด๋‹ค.

- ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์˜ ์กฐํ•ฉ์˜ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ผ.

 

๐Ÿค” ์ ‘๊ทผ๋ฒ•

์ดํ•ด๊ฐ€ ์‰ฝ๋„๋ก ์˜ˆ์‹œ๋กœ ์ ‘๊ทผํ–ˆ๋‹ค.

๋งŒ์•ฝ ``clothes = [["A", "headgear"], ["B", "eyewear"], ["C", "eyewear"], ["D", "face"], ["E", "face"], ["F", "face"]]` ์ด๋ผ๋ฉด, ์˜์ƒ ์ข…๋ฅ˜(headgear, eyewear, face)์˜ ์ˆ˜๋Š” 3๊ฐœ์ด๋ฏ€๋กœ ๋ชจ๋“  ์กฐํ•ฉ์€ ์˜์ƒ์„ 1 ~ 3๊ฐœ ์„ ํƒํ•  ๋•Œ์—์„œ ๋‚˜์˜จ๋‹ค.

 

1) ์˜์ƒ์„ 1๊ฐœ ์„ ํƒํ•  ๋•Œ

['headgear'] ์„ ํƒ -> 1๊ฐ€์ง€

['eyewear'] ์„ ํƒ -> 2๊ฐ€์ง€

['face'] ์„ ํƒ -> 3๊ฐ€์ง€

โžก๏ธ ์ด๋•Œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 6(=1+2+3)๊ฐ€์ง€

 

2) ์˜์ƒ์„ 2๊ฐœ ์„ ํƒํ•  ๋•Œ

['headgear', 'eyewear'] ์„ ํƒ -> 1 * 2 = 2๊ฐ€์ง€

['headgear', 'face'] ์„ ํƒ -> 1 * 3 = 3๊ฐ€์ง€

['eyewear', 'face']์„ ํƒ -> 2 * 3 = 6๊ฐ€์ง€

โžก๏ธ ์ด๋•Œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 11(=2+3+6)๊ฐ€์ง€

 

3) ์˜์ƒ์„ 3๊ฐœ ์„ ํƒํ•  ๋•Œ

['headgear', 'eyewear', 'face'] ์„ ํƒ -> 1 * 2 * 3 = 6๊ฐ€์ง€

โžก๏ธ ์ด๋•Œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 6๊ฐ€์ง€

 

๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 23(=6+11+6)๊ฐ€์ง€์ด๋‹ค.

 

์ฆ‰, ์˜์ƒ์˜ ์ข…๋ฅ˜๊ฐ€ n๊ฐœ ์žˆ์„ ๋•Œ ๊ทธ ์ค‘ 1๊ฐœ๋ถ€ํ„ฐ n๊ฐœ๊นŒ์ง€ ์„ ํƒํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์„ ํƒํ•œ ๊ฐ๊ฐ์˜ ์กฐํ•ฉ์— ๋Œ€ํ•ด์„œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•œ๋’ค ์ด๋ฅผ ๋ˆ„์ ํ•˜์—ฌ ์ •๋‹ต์„ ๊ตฌํ•œ๋‹ค. 

 

๐Ÿ’ช ๋ฌด์‹ํ•˜๊ฒŒ ํ’€๊ธฐ

์˜์ƒ์˜ ์ข…๋ฅ˜๋ฅผ key๋กœ ๊ฐ€์ง€๋ฉด์„œ ์ด๋ฆ„ ๋ฆฌ์ŠคํŠธ๋ฅผ value๋กœ ๊ฐ€์ง€๋Š” `dic` ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์ด์šฉํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, `clothes = [["A", "headgear"], ["B", "eyewear"], ["C", "eyewear"], ["D", "face"], ["E", "face"], ["F", "face"]]` ์ด๋ผ๋ฉด,

`dic`์—๋Š” `{'headgear': ['A'], 'eyewear': ['B', 'C'], 'face': ['D', 'E', 'F']}`๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด์ œ ๋ฐ˜๋ณต๋ฌธ์ด ์ด 3๊ฐœ๊ฐ€ ๋“ฑ์žฅํ•œ๋‹ค. ๋“ฑ์žฅ ์ˆœ์„œ๋Œ€๋กœ ์œ„ ์˜ˆ์‹œ์— ๋น—๋Œ€์–ด ์„ค๋ช…ํ•˜์ž๋ฉด,

์ฒซ ๋ฒˆ์งธ for๋ฌธ: 3๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ์˜์ƒ(headgear, eyewear, face) ์ค‘์—์„œ ๋ช‡(=`i`) ๊ฐ€์ง€ ์˜์ƒ์„ ์ž…์„์ง€ "๊ฐœ์ˆ˜" ์„ ํƒ

๋‘ ๋ฒˆ์งธ for๋ฌธ: `i`๊ฐœ์˜ ์˜์ƒ์„ ์ž…์–ด์•ผ ํ•  ๋•Œ, ์ „์ฒด ์˜์ƒ "์ข…๋ฅ˜" ์ค‘์—์„œ `i`๊ฐœ์˜ ์กฐํ•ฉ ์„ ํƒ

๋งˆ์ง€๋ง‰ for๋ฌธ: ์„ ํƒ๋œ `i`๊ฐœ์˜ ์กฐํ•ฉ์—์„œ ์˜์ƒ์˜ "์ด๋ฆ„"์— ๋”ฐ๋ผ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ ๊ณ„์‚ฐ

from collections import defaultdict
from itertools import combinations

def solution(clothes):
    dic = defaultdict(list)
    for name, ty in clothes: # ์˜์ƒ ์ด๋ฆ„, ์ข…๋ฅ˜
        dic[ty].append(name)
        
    res = 0
    for i in range(1, len(dic)+1):
        for x in combinations(dic.keys(), i): # 3P1, 3P2, 3P3
            tmp = 1 # ๊ฐ€์ง„ ์•„์ดํ…œ ์ค‘ i๊ฐœ ๊ณจ๋ž์„ ๋•Œ ์กฐํ•ฉ ์ˆ˜
            for item in x:
                tmp *= len(dic[item]) # ํ•œ ์กฐํ•ฉ์— ๋ฝ‘ํžŒ ์š”์†Œ๋ผ๋ฆฌ ๊ณฑ์…ˆ
            res += tmp
    
    return res

์ƒ๊ฐ๋‚˜๋Š”๋Œ€๋กœ ๋ฌด์‹ํ•˜๊ฒŒ ํ‘ผ ํ’€์ด์ด๋‹ค๋ณด๋‹ˆ ์‚ผ์ค‘ ๋ฐ˜๋ณต๋ฌธ์ด ๋‚˜์˜ค๊ณ  ๋ง์•˜๋‹ค..๐Ÿ˜ฑ

์ฑ„์  ๊ฒฐ๊ณผ, ์‹œ๊ฐ„ ์ดˆ๊ณผ๋กœ ํ•œ ๊ฐœ์˜ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.

์ด๋ฅผ ์ตœ์ ํ™”ํ•ด๋ณด์žโ—๏ธ

 

๐ŸŽฏ ์ตœ์ ํ™”

์œ„์—์„œ ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ์™€ ๋™์ผํ•˜๊ฒŒ `{'headgear': ['A'], 'eyewear': ['B', 'C'], 'face': ['D', 'E', 'F']}`์ด ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ,

์˜์ƒ์˜ ์กฐํ•ฉ์„ ํฌ๊ฒŒ ๋ณด๋ฉด headgear X eyewear X face ์˜ ์กฐํ•ฉ์ด๋‹ค.

 

๊ฐ ๊ฐ€์ง€์ˆ˜๋ฅผ ์ƒ๊ฐํ–ˆ์„ ๋•Œ,

headgear๋Š” ('A' 1๊ฐ€์ง€) + (headgear ์ฐฉ์šฉ ์•ˆํ•˜๋Š” ๊ฒฝ์šฐ 1๊ฐ€์ง€) = ์ด 2๊ฐ€์ง€

eyewear๋Š” ('B', 'C' 2๊ฐ€์ง€) + (eyewear ์ฐฉ์šฉ ์•ˆํ•˜๋Š” ๊ฒฝ์šฐ 1๊ฐ€์ง€) = ์ด 3๊ฐ€์ง€

face๋Š” ('D', 'E', 'F' 3๊ฐ€์ง€) + (face ์ฐฉ์šฉ ์•ˆํ•˜๋Š” ๊ฒฝ์šฐ 1๊ฐ€์ง€) = ์ด 4๊ฐ€์ง€

 

๋”ฐ๋ผ์„œ headgear X eyewear X face ์˜ ์กฐํ•ฉ์˜ ์ˆ˜๋Š” 2 * 3 * 4 = 24๊ฐ€์ง€์ด๋‹ค.

 

โš ๏ธ ๋ฌธ์ œ์—์„œ "ํ•˜๋ฃจ์— ์ตœ์†Œ ํ•œ ๊ฐœ์˜ ์˜์ƒ์€ ์ž…๋Š”๋‹ค."๋Š” ์กฐ๊ฑด์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—,

์œ„ ์กฐํ•ฉ์—์„œ (headgear ์ฐฉ์šฉ ์•ˆํ•˜๋Š” ๊ฒฝ์šฐ) X (eyewear ์ฐฉ์šฉ ์•ˆํ•˜๋Š” ๊ฒฝ์šฐ) X (face ์ฐฉ์šฉ ์•ˆํ•˜๋Š” ๊ฒฝ์šฐ) = 1๊ฐ€์ง€๋ฅผ ์ œ์™ธํ•œ๋‹ค.

 

๋”ฐ๋ผ์„œ ์œ„ ์˜ˆ์ œ์—์„œ ๋‹ต์€ 24 - 1 = 23๊ฐ€์ง€์ด๋‹ค.

์ฆ‰, `(headgear ์ˆ˜ + 1) * (eyewear ์ˆ˜ + 1) * (face ์ˆ˜ + 1) - 1` ์˜ ๊ณต์‹์œผ๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

from collections import defaultdict
def solution(clothes):
    dic = defaultdict(list)
    for name, tpe in clothes:
        dic[tpe].append(name)
    
    res = 1
    for x in dic.values():
        res *= (len(x) + 1)
    
    return res - 1

์˜จ์ „ํžˆ ํ˜ผ์ž ์ƒ๊ฐํ•ด๋‚ธ ํ’€์ด๋ผ ๋ฟŒ๋“ฏํ–ˆ๋‹ค. ๐Ÿ˜‹

 

๐Ÿ‘€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๋ฅผ ํƒ๊ตฌํ•ด๋ณด๊ธฐ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๊ฐ™์œผ๋‚˜ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•œ ํ’€์ด์ด๋‹ค.

๋‚˜๋Š” ๊ฐ ์˜์ƒ์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ฅธ ์ด๋ฆ„์„ ๋ฆฌ์ŠคํŠธ๋กœ ์ €์žฅํ–ˆ์œผ๋‚˜, ์•„๋ž˜ ํ’€์ด๋Š” ๊ฐ ์˜์ƒ์˜ ์ข…๋ฅ˜๋ฅผ ๋ˆ„์ ํ•˜๋ฉฐ ์นด์šดํŠธ๋งŒ ํ•œ๋‹ค.

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ์ข…๋ฅ˜์— ๋”ฐ๋ฅธ ์˜์ƒ์˜ "๊ฐœ์ˆ˜"๋งŒ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ ์ธ ํ’€์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

def solution(clothes):
    dic = dict() # ํŠน์ • ์ข…๋ฅ˜ ์˜์ƒ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‹ด์„ ๋”•์…”๋„ˆ๋ฆฌ
    for name, tpe in clothes:
        dic[tpe] = dic.get(tpe, 0) + 1
    
    res = 1
    for x in dic.values():
        res *= (x + 1)
    
    return res - 1

 

๐Ÿ“š ์ฐธ๊ณ  ์ž๋ฃŒ

https://aiday.tistory.com/131