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
๐ ์ฐธ๊ณ ์๋ฃ
'๐ซ ETC > Problem Solving' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๊นํ์ ์๊ณ ๋ฆฌ์ฆ] ์ฌ๊ณผ๋๋ฌด (BFS) (0) | 2023.11.07 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] ๊ณผ์ ์งํํ๊ธฐ (0) | 2023.09.27 |
[ํ๋ก๊ทธ๋๋จธ์ค] [1์ฐจ] ์ ํ๋ฒ์ค (0) | 2023.09.23 |
[ํ๋ก๊ทธ๋๋จธ์ค] ํผ์ ๋๊ธฐ์ ๋ฌ์ธ (0) | 2023.09.22 |
[BOJ] 3460. ์ด์ง์ (0) | 2023.09.22 |