JiYoung Dev πŸ–₯

[파이썬] μ•Œκ³ λ¦¬μ¦˜ νŒ¨λŸ¬λ‹€μž„ : Dynamic Programming μ—°μŠ΅λ¬Έμ œ λ³Έλ¬Έ

python

[파이썬] μ•Œκ³ λ¦¬μ¦˜ νŒ¨λŸ¬λ‹€μž„ : Dynamic Programming μ—°μŠ΅λ¬Έμ œ

Shinjio 2023. 2. 28. 15:44

2023.02.28 μ½”λ“œμž‡ ν•™μŠ΅λ‚΄μš©

 

πŸ”Ž Dynamic Programming μ—°μŠ΅λ¬Έμ œ 

가지고 μžˆλŠ” μƒˆκΌΌλ‹¬κΌΌμœΌλ‘œ λ²Œμ–΄λ“€μΌ 수 μžˆλŠ” μ΅œλŒ€ 수읡 κ΅¬ν•˜κΈ°

price_list : κ°œμˆ˜λ³„ 가격이 μ •λ¦¬λ˜μ–΄ μžˆλŠ” 리슀트

count : νŒλ§€ν•  μƒˆκΌΌλ‹¬κΌΌ 개수

cache : κ°œμˆ˜λ³„ μ΅œλŒ€ 수읡이 μ €μž₯λ˜μ–΄ μžˆλŠ” 사전

 

πŸ“– memoization으둜 문제 ν’€κΈ°

β‘  base case : 0개 νŒ”μ•˜μ„ λ•Œ ν˜Ήμ€ 1개 νŒ”μ•˜μ„ λ•Œμ—λŠ” price_list의 가격 κ·ΈλŒ€λ‘œ 좜λ ₯

β‘‘ recursive case : μ΅œλŒ€ 수읡 κ΅¬ν•˜κΈ°

 

1개 νŒ”μ•˜μ„ λ•Œ 수읡 : 100
2개 νŒ”μ•˜μ„ λ•Œ λ‚˜μ˜¬ 수 μžˆλŠ” 수읡 : (1개, 1개) νŒ”μ•˜μ„ λ•Œ ν˜Ήμ€ (2개, 0개) νŒ”μ•˜μ„ λ•Œ
3개 νŒ”μ•˜μ„ λ•Œ λ‚˜μ˜¬ 수 μžˆλŠ” 수읡 : (1개, 2개) νŒ”μ•˜μ„ λ•Œ ν˜Ήμ€ (3개, 0개) νŒ”μ•˜μ„ λ•Œ
4개 νŒ”μ•˜μ„ λ•Œ λ‚˜μ˜¬ 수 μžˆλŠ” 수읡 : (1개, 3개) νŒ”μ•˜μ„ λ•Œ ν˜Ήμ€ (2개, 2개) νŒ”μ•˜μ„ λ•Œ ν˜Ήμ€ (0개, 4개) νŒ”μ•˜μ„ λ•Œ
5개 νŒ”μ•˜μ„ λ•Œ λ‚˜μ˜¬ 수 μžˆλŠ” 수읡 : (1개, 4개) νŒ”μ•˜μ„ λ•Œ ν˜Ήμ€ (2개, 3개) νŒ”μ•˜μ„ λ•Œ ν˜Ήμ€ (0개, 5개) νŒ”μ•˜μ„ λ•Œ
...
n개 νŒ”μ•˜μ„ λ•Œ λ‚˜μ˜¬ 수 μžˆλŠ” 수읡 : (1개, n-1개) & (2개, n-2개) & (3개, n-3개) & ( n // 2개, n - n // 2개) & (0개, n개)
for i in range(1, n // 2 + 1):
    profit = max(max_profit_memo(price_list, i, cache) + max_profit_memo(price_list, n - i, cahce)
   #μ—¬κΈ°μ„œ 0개, n개 νŒλ§€ν–ˆμ„ λ•Œ λ‚˜μ˜€λŠ” μˆ˜μ΅μ€ 확인 μ•ˆν–ˆμŒ

μ—¬κΈ°μ„œ 0개, n개 νŒλ§€κ°€ κ°€λŠ₯ν•œ κ²½μš°λŠ” n이 price_list의 리슀트 κ°œμˆ˜λ³΄λ‹€ μž‘κ±°λ‚˜ 같은 κ²½μš°μ—λ§Œ κ°€λŠ₯
if n < len(price_list):
    profit = price_list[n]
else:
    profit = 0

μœ„μ˜ 경우의 수λ₯Ό λͺ¨λ‘ ν™•μΈν•˜μ—¬ κ°€μž₯ 큰 값을 μ΅œλŒ€ 수읡으둜 μ €μž₯
profit = max(profit, max_profit_memo(price_list, i, cache) + max_profit_memo(price_list, n - i, cahce))

 

πŸ“– Tabulation으둜 문제 ν’€κΈ°

반볡문 μ‚¬μš©ν•˜μ—¬ 리슀트 μ±„μš°κΈ°

 

β–Όβ–Όβ–Ό λ‚΄κ°€ μž‘μ„±ν•œ μ½”λ“œ β–Όβ–Όβ–Ό

차이점 : for λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•˜μ§€ μ•Šκ³  λ°”λ‘œ max값을 κ³„μ‚°ν•΄μ„œ λ¦¬μŠ€νŠΈμ— μ €μž₯

닡은 λ§žμ§€λ§Œ for λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄ 틀릴 μˆ˜λ„ μžˆμœΌλ―€λ‘œ for λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•΄μ„œ 1, i -1λΆ€ν„° 2//n, 1 - 2//nκΉŒμ§€μ˜ 경우의 수 쀑 κ°€μž₯ 큰 값을 μ €μž₯ν•˜λ„λ‘ 해야함