16์ฅ. ๊ทธ๋ฆฌ๋
16-1. ๊ทธ๋ฆฌ๋ ๊ฐ๋
- ๋ฌธ์ ํด๊ฒฐ ๊ณผ์ ์์ ๊ฒฐ์ ์๊ฐ๋ง๋ค ๋ ์์ ๋ณด์ด๋ ์ต์ ์ ์ ํ์ ํ๋ฉฐ ์ ํ์ ๋ฒ๋ณตํ์ง ์๋ ์๊ณ ๋ฆฌ์ฆ
- ์ง์ญ ์ต์ ํด ์ถ๊ตฌ(์ ์ฒด์์์ ์ต์ ํด ๋ณด์ฅ X)
1) ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ด ์ต์ ํด๋ฅผ ๋ณด์ฅํ๋ ค๋ฉด?
- ์๋์ ๊ฐ์ ํน์ ์ํฉ์์ ์ต์ ํด ๋ณด์ฅ
- ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ : ๋ถ๋ถํด๋ฅผ ํธ๋ ๊ณผ์ ์ด ์ต์ ํด๋ฅผ ๊ตฌํ๋ ๊ณผ์ ๊ณผ ์ผ์น
- ๊ทธ๋ฆฌ๋ ์ ํ ์์ฑ : ์ ํ ๊ณผ์ ์ด ๋ค๋ฅธ ๊ณผ์ ์ ์ํฅ์ ์ฃผ์ง ์์
- ํ๊ณ๋ ์์ง๋ง, ๋น ๋ฅธ ์๊ฐ ๋ด์ ๊ทผ์ฌํด๋ฅผ ์ ๊ณต ๊ฐ๋ฅ
16-2. ์ต์ ์ ์ฅ ํธ๋ฆฌ
1) ์ ์ฅ ํธ๋ฆฌ๋?
- ๋ชจ๋ ์ ์ ์ด ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๊ณ ๊ฐ์ ๊ฐ์๊ฐ ์ ์ ๊ฐ์๋ณด๋ค ํ๋ ์ ์ ๊ทธ๋ํ
2) ์ต์ ์ ์ฅ ํธ๋ฆฌ(Minimum Spanning Tree; MST)๋?
- ์ ์ฅ ํธ๋ฆฌ ์ค ๊ฐ์ ์ ๊ฐ์ค์น ํฉ์ด ์ต์์ธ ๊ฒฝ์ฐ
- ์ต์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ
- ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ : ์์ ์ ์ ์์ ์ต์ ์ธ์ ๊ฐ์ค์น๋ฅผ ๊ฐ์ง๋ ์ ์ ์ ์ฐพ์ ํ์ฅํ๋ ๋ฐฉ์
- ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ : ์ต์ ๊ฐ์ค์น๋ฅผ ๊ฐ์ง๋ ๊ฐ์ ๋ถํฐ ํ๋์ฉ ์ถ๊ฐํ๋ ๋ฐฉ์
16-3. ๋ฐฐ๋ญ ๋ฌธ์ (Knapsack Problem; ๋
์ ๋ฌธ์ )
- ์ง๋ค์ ์ ์กฐํฉํ์ฌ ๋ฐฐ๋ญ์ ๋ฌด๊ฒ๋ฅผ ์ด๊ณผํ์ง ์์ผ๋ฉด์ ๋ด์ ๊ฐ์น๋ฅผ ์ต๋๋ก ํ๋ ๋ฌธ์
1) ์ง์ ์ชผ๊ฐค ์ ์๋ ๋ถ๋ถ ๋ฐฐ๋ญ ๋ฌธ์
- ๋ถ๋ถ ๋ฐฐ๋ญ ๋ฌธ์ (Fractional Knapsack Problem) ํด๊ฒฐ ๋ฐฉ๋ฒ : ๋ฌด๊ฒ ๋น ๊ฐ์น๊ฐ ๋์ ์ง์ ์ต๋ํ ๋ง์ด ๋ฃ๋ ๊ทธ๋ฆฌํผ ์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉ
2) ์ง์ ์ชผ๊ฐค ์ ์๋ 0/1 ๋ฐฐ๋ญ ๋ฌธ์
- ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ํตํ ์ต์ ํด ๊ตฌํ๊ธฐ ๋ถ๊ฐ๋ฅ
- ๋์ ๊ณํ๋ฒ์ผ๋ก ์ ๊ทผ ํ์
16-4. ๋ชธํ๊ธฐ ๋ฌธ์
- ๋ฌธ์ 80_๊ฑฐ์ค๋ฆ๋ ์ฃผ๊ธฐ
def solution(amount):
units = [1, 10, 50, 100]
units.sort(reverse=True)
changes = []
for coin in units:
while amount >= coin:
changes.append(coin)
amount -= coin
return changes
# TEST ์ฝ๋ ์
๋๋ค. ์ฃผ์์ ํ๊ณ ์คํ์์ผ๋ณด์ธ์
print(solution(123)) # ๋ฐํ๊ฐ : [100, 10, 10, 1, 1, 1]
print(solution(350)) # ๋ฐํ๊ฐ : [100, 100, 100, 50]
- ๋ฌธ์ 81_๋ถ๋ถ ๋ฐฐ๋ญ ๋ฌธ์
def solution(items, weight_limit):
for item in items:
item.append(item[1] / item[0])
items = sorted(items, key=lambda x:x[2], reverse=True)
sum_value = 0
for item in items:
if weight_limit >= item[0]:
sum_value += item[1]
weight_limit -= item[0]
else:
if weight_limit == 0:
break
value = item[1] * weight_limit / item[0]
sum_value += value
break
return sum_value
# TEST ์ฝ๋ ์
๋๋ค. ์ฃผ์์ ํ๊ณ ์คํ์์ผ๋ณด์ธ์
print(solution([[10, 19], [7, 10], [6, 10]], 15)) # ๋ฐํ๊ฐ : 27.33
print(solution([[10, 60], [20, 100], [30, 120]], 50)) # ๋ฐํ๊ฐ : 240
16-5. ํฉ๊ฒฉ์๊ฐ ๋๋ ๋ชจ์ ํ
์คํธ