dynamic_programming

Dynamic programming

์ปดํ“จํ„ฐ๋ฅผ ์ด์šฉํ•ด๋„ ์‹œ๊ฐ„์ด ๋งค์šฐ ๋งŽ์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ๋งค์šฐ ๋งŽ์ด ํ•„์š”ํ•˜๋ฉด ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์•ฝ๊ฐ„ ๋” ์‚ฌ์šฉํ•˜๋ฉด, ์—ฐ์‚ฐ ์†๋„๋ฅผ ๋น„์•ฝ์ ์œผ๋กœ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ณ , ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•. ๋™์  ๊ณ„ํš๋ฒ•์ด๋‹ค.

  • ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๋™์  ํ• ๋‹น์˜ ๋‹ค์ด๋‚˜๋ฏน์€ ๊ฐ™์€ ์˜๋ฏธ์ผ๊นŒ?

    Dynamic: 
        ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋„์ค‘์—
    
    ex) ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ ๋™์ ํ• ๋‹น (Dynamic Allocation) ์€ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘ ํ”„๋กœ๊ทธ๋žจ์— ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ธฐ๋ฒ•.

๋‹ค์ด๋‚˜๋ฏน ์‚ฌ์šฉ์กฐ๊ฑด

  1. ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

  2. ์ž‘์€ ๋ฌธ์ œ์—์„œ ๊ตฌํ•œ ์ •๋‹ต์€ ๊ทธ๊ฒƒ์„ ํฌํ•จํ•˜๋Š” ํฐ ๋ฌธ์ œ์—์„œ๋„ ๋™์ผํ•˜๋‹ค.

  3. ์œ„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋Œ€ํ‘œ ๋ฌธ์ œ: ํ”ผ๋ณด๋‚˜์น˜

    def fibo(n):
      if n == 1 or 2:
        return 1
      return fibo(n - 1) + fibo(n - 2)
    • O(2^N) ์˜ ๊ณ„์‚ฐ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ ธ 100 ๋งŒ ๋˜๋”๋ผ๋„ ์ˆ˜๋ฐฑ์–ต๋…„์ด ๊ฑธ๋ฆฐ๋‹ค.

Memoization (Top - Down)

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•œ ์ข…๋ฅ˜. ํ•œ ๋ฒˆ ๊ณ„์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ด๋”˜๊ฐ€์— ๋‹ด์•„๋‘๋Š” ๊ฒƒ์„ ์˜๋ฏธ

ํ•œ ๋ฒˆ ๊ตฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ๋ฉ”๋ชจํ•ด๋‘๊ณ  ๊ฐ™์€ ์‹์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ”๋ชจํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜ด

์บ์‹ฑ (Caching) ์ด๋ผ๊ณ ๋„ ํ•จ

  • Implementation

    • ํ•œ ๋ฒˆ ๊ตฌํ•œ ์ •๋ณด๋ฅผ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ. ์žฌ๊ท€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋‹ค๊ฐ€ ๊ฐ™์€ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์ด๋ฏธ ๊ตฌํ•œ ์ •๋‹ต์„ ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฐ€์ ธ์˜ด

      ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ˜ธ์ถœ

      # ํ•œ ๋ฒˆ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ (memoization) ํ•˜๊ธฐ ์œ„ํ•œ ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”
      d = [0] * 100
      
      # ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ (ํƒ‘๋‹ค์šด ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ)
      def fibo(x):
            # ์ข…๋ฃŒ ์กฐ๊ฑด
          if x == 1 or 2:
                  return 1
            # ์ด๋ฏธ ๊ณ„์‚ฐํ•œ ์  ์žˆ๋Š” ๋ฌธ์ œ๋ผ๋ฉด ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜
            if d[x] != 0:
                  return d[x]
            # ์•„์ง ๊ณ„์‚ฐํ•˜์ง€ ์•Š์€ ๋ฌธ์ œ๋ผ๋ฉด ์ ํ™”์‹์— ๋”ฐ๋ผ์„œ ํ”ผ๋ณด๋‚˜์น˜ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
            d[x] = fibo(x - 1) + fibo(x - 2)
            return d[x]
  • ๋•Œ์— ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ์ž๋ฃŒํ˜•, ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์ „(dict) ์ž๋ฃŒํ˜•์„ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ˆ˜์—ด์ฒ˜๋Ÿผ ์—ฐ์†์ ์ด์ง€ ์•Š์€ ๊ฒฝ์šฐ ์œ ์šฉํ•จ.

Bottom - Up

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ „ํ˜•์ ์ธ ํ˜•ํƒœ

๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•ด ์ž‘์€ ๋ฌธ์ œ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๋‹ต์„ ๋„์ถœ

# ์•ž์„œ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ DB ํ…Œ์ด๋ธ” ์ดˆ๊ธฐํ™”
d = [0] * 100

# ์ฒซ ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์™€ ๋‘ ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋Š” 1
d[1] = 1
d[2] = 1
n == 99

# ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ตฌํ˜„
for i in range(3, n + 1):
    d[i] = d[i - 1] + d[i - 2]

LIS (๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด)

D[i]: a[i] ๋กœ ๋๋‚˜๋Š” ๊ฐ€์žฅ ๊ธด ์ˆ˜์—ด

for i in range(n):
    for j in range(i):
            # ์• ์ดˆ์— i ๋ฒˆ์งธ๊ฐ€ ๊ฐ€์žฅ ํฌ์ง€ ์•Š์œผ๋ฉด ์˜๋ฏธ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—
            if a[j] < a[i]:
                D[i] = max(D[j] + 1, D[i])

LCS (์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„ ๋ฌธ์ž์—ด)

ํ•œ ๋ฌธ์ž์—ด์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋‚˜์”ฉ ํ•ด๋‚˜๊ฐ

  1. String1[i] == String2[j] ๋ผ๋ฉด [i, j] = [i - 1, j - 1] + 1

  2. String1[i] != String2[j] ๋ผ๋ฉด [i, j] = [i - 1, j] ์™€ [i, j - 1] ์ค‘ ํฐ ๊ฒƒ

Knapsack Problem

2์ฐจ์› DP ๋กœ ๋งค ์ˆœ๊ฐ„ ๋“ค์–ด์˜ค๋Š” ๋ฌผ๊ฑด์— ๋”ฐ๋ผ ์ƒˆ๋กœ์šด ํ–‰์„ ์ฑ„์›Œ๋‚˜๊ฐ€๋ณด์ž

ํŽธ์ง‘๊ฑฐ๋ฆฌ

๋ธ”๋กœ๊ทธ

etc

  • ๋Œ€๋ถ€๋ถ„ DP ํ•ต์‹ฌ์€, ๋งค ๋ฒˆ๋งˆ๋‹ค ์ตœ์„ ์˜๊ฒƒ ์„ ํƒํ•ด๊ฐ€๋Š” ๊ฒƒ์ด๋‹ˆ ๋น„๊ต๋Œ€์ƒ ์„ ์ž˜ ๊ฒ€์ฆํ•˜์ž

    • ์ž‘์€ ๊ฒฝ์šฐ์˜ ์–ด๋–ค ํ•ด๊ฐ€ ์ ์šฉ๋˜๋Š”์ง€ ์ž˜ ๋ณด์ž

  • DP ํ…Œ์ด๋ธ”

    • ํ…Œ์ด๋ธ”์„ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ• ์ง€, ๋ช‡ ์ฐจ์›

    • ํ–‰, ์—ด์€ ์–ด๋–ป๊ฒŒ ์ •ํ• ์ง€

    • ์ด์ „์˜ ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ์ฐธ๊ณ ํ•ด์„œ ํ˜„์žฌ๊ฐ’์„ ๊ฒฐ์ •ํ•˜๋Š”์ง€

  • ์ฝ”ํ…Œ์—์„œ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋Œ€์ฒด๋กœ ๊ฐ„๋‹จํ•œ ํ˜•ํƒœ๋กœ ์ถœ์ œ๋œ๋‹ค.

  • ์ฃผ์–ด์ง„ ๋ฌธ์ œ๊ฐ€ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์œ ํ˜•์ธ์ง€ ํŒŒ์•…ํ•˜์ž

    • ๋ฌธ์ œ์—์„œ ์ž‘์€ ๋ฌธ์ œ์˜ ์ •๋‹ต์ด ์ด ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํฌํ•จํ•˜๋Š” ํฐ ๋ฌธ์ œ์—์„œ๋„ ๋™์ผํ•œ ๊ฒƒ์ธ์ง€ ํŒŒ์•…์ด ์ค‘์š”

    • ๊ทผ๋ฐ ์ด๊ฑด ๋ณดํ…€์—…๋ฐฉ์‹์œผ๋กœ 0, 1, 2 ๋ฅผ ํ•˜๋‹ค๋ณด๋ฉด ๊ทœ์น™์ด ๋ณด์ด๊ณ , ์ค‘๋ณต๋˜๋Š”๊ฑธ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•˜๊ธฐ ์†์‰ฝ๋‹ค.

  • ์ผ๋‹จ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ•˜๊ณ , ์ž‘์€ ๋ฌธ์ œ์—์„œ ๊ตฌํ•œ ๋‹ต์ด ํฐ ๋ฌธ์ œ์—์„œ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ๋œ๋‹ค๋ฉด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํ™œ์šฉ

  • ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋ณดํ…€์—… ๋ฐฉ์‹์„ ๊ถŒ์žฅ

    • recursion depth ์˜ค๋ฅ˜๊ฐ€ ๋‚  ์ˆ˜ ์žˆ๋‹ค

      • Sys.setrecursionlimit() ๋งค์„œ๋“œ ํ˜ธ์ถœํ•˜์—ฌ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ์Œ

Last updated