TIL_24 : Dynamic Programming

JaHyeon Guยท2021๋…„ 8์›” 4์ผ
0

Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
6/7
post-thumbnail

๐Ÿ™„ Dynamic Programming


โžก Dynamic Programming?

  • ํ•œ๋ฒˆ ๊ณ„์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ์žฌํ™œ์šฉํ•˜๋Š” ๋ฐฉ์‹

โžก Dynamic Programming์˜ ์กฐ๊ฑด

  • ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ (Optimal Substructure)
    โžก ๋ถ€๋ถ„ ๋ฌธ์ œ๋“ค์˜ ์ตœ์ ์˜ ๋‹ต์„ ์ด์šฉํ•ด ๊ธฐ์กด ๋ฌธ์ œ์˜ ์ตœ์ ์˜ ๋‹ต์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค

  • ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ (Overlapping Subproblems)
    โžก ๋ถ€๋ถ„ ๋ฌธ์ œ๋“ค์„ ํ’€๋‹ค๋ณด๋ฉด ์ค‘๋ณต๋˜๋Š” ๋ฌธ์ œ๋“ค์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค


โžก Dynamic Programming ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

  • Memoization

  • Tabulation



๐Ÿ™„ Memoization


โžก Memoization?

  • ์ค‘๋ณต๋˜๋Š” ๊ณ„์‚ฐ์€ ํ•œ ๋ฒˆ๋งŒ ๊ณ„์‚ฐ ํ›„ ๋ฉ”๋ชจ
  • ํ•˜ํ–ฅ์‹ ์ ‘๊ทผ (Top-down Approach)
  • ์žฌ๊ท€

โžก ํ”ผ๋ณด๋‚˜์น˜ Memoization

def fib_memo(n, cache):
    if n < 3:
        return 1
    if n in cache:
        return cache[n]
    cache[n] = fib_memo(n - 1, cache) + fib_memo(n - 2, cache)
    return cache[n]

def fib(n):
    # n๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๋‹ด๋Š” ์‚ฌ์ „
    fib_cache = {}
    return fib_memo(n, fib_cache)

print(fib(10))
print(fib(50))
print(fib(100))

# 55
# 12586269025
# 354224848179261915075



๐Ÿ™„ Tabulation


โžก Tabulation?

  • Table ๋ฐฉ์‹์œผ๋กœ ์ •๋ฆฌ
  • ์ƒํ–ฅ์‹ ์ ‘๊ทผ (Bottom-up Approach)
  • ๋ฐ˜๋ณต๋ฌธ

โžก ํ”ผ๋ณด๋‚˜์น˜ Tabulation

def fib_tab(n):
    table = []
    for i in range(n):
        if i <= 1:
            table.append(1)
        else:
            table.append(table[i-2]+table[i-1])
    return table[-1]
   
print(fib_tab(10))

# 55



๐Ÿ™„ Memoization vs Tabulation


  • ๊ณตํ†ต์  : ๋‘˜ ๋‹ค ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ๋น„ํšจ์œจ์„ ํ•ด๊ฒฐ

  • ์ฐจ์ด์ 

MemoizationTabulation
์žฌ๊ท€ํ•จ์ˆ˜ ์‚ฌ์šฉ๋ฐ˜๋ณต๋ฌธ ์‚ฌ์šฉ
๊ณผ๋„ํ•œ Call stack์œผ๋กœ ๊ณผ๋ถ€ํ•˜, ์˜ค๋ฅ˜๊ฐ€ ๋‚  ์ˆ˜ ์žˆ์ŒCall stack์œผ๋กœ ์ธํ•œ ์˜ค๋ฅ˜ ์œ„ํ—˜ ์—†์Œ
ํ•„์š”์—†๋Š” ๊ณ„์‚ฐ์€ ์•ˆํ•ด๋„ ๋˜๋Š” ์žฅ์ ํ•„์š”์—†๋Š” ๊ณ„์‚ฐ๊นŒ์ง€ ๋‹ค ํ•ด์•ผํ•˜๋Š” ๋‹จ์ 
profile
IWBAGDS

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด