๐Ÿ—๏ธ Algorithm/๐ŸŸฆ ์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ

[์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ] ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Dynamic Programming)

Dbswnstjd 2022. 2. 24. 02:18

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ( Dynamic Programming )

  • ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋™์  ๊ณ„ํš๋ฒ•์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค
  • ์ผ๋ฐ˜์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ถ„์•ผ์—์„œ์˜ ๋™์ (Dynamic)์ด๋ž€ ์–ด๋–ค ์˜๋ฏธ๋ฅผ ๊ฐ€์งˆ๊นŒ?
    • ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ ๋™์  ํ• ๋‹น(Dynamic Allocation)์€ 'ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋„์ค‘์— ์‹คํ–‰์— ํ•„์š”ํ•œ
      ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ธฐ๋ฒ•'
      ์„ ์˜๋ฏธํ•œ๋‹ค
    • ๋ฐ˜๋ฉด์— ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ '๋‹ค์ด๋‚˜๋ฏน'์€ ๋ณ„๋‹ค๋ฅธ ์˜๋ฏธ ์—†์ด ์‚ฌ์šฉ๋œ ๋‹จ์–ด์ด๋‹ค
  • ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋‹ค์Œ์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค
    1. ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ (Optimal Substructure)
      • ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž‘์€ ๋ฌธ์ œ์˜ ๋‹ต์„ ๋ชจ์•„์„œ ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค
    2. ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ (Overlapping Subproblem)
      • ๋™์ผํ•œ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค

๋ฉ”๋ชจ์ด์ œ์ด์…˜ (Memoization)

  • ๋ฉ”๋ชจ์ด์ œ์ด์…˜์€ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค
  • ํ•œ ๋ฒˆ ๊ณ„์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ๋ฉ”๋ชจํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค
    • ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ”๋ชจํ–ˆ๋˜ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜จ๋‹ค
    • ๊ฐ’์„ ๊ธฐ๋กํ•ด ๋†“๋Š”๋‹ค๋Š” ์ ์—์„œ ์บ์‹ฑ(Caching) ์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค

ํƒ‘๋‹ค์šด VS ๋ณดํ…€์—…

  • ํƒ‘๋‹ค์šด(๋ฉ”๋ชจ์ด์ œ์ด์…˜) ๋ฐฉ์‹์€ ํ•˜ํ–ฅ์‹์ด๋ผ๊ณ ๋„ ํ•˜๋ฉฐ ๋ณดํ…€์—… ๋ฐฉ์‹์€ ์ƒํ–ฅ์‹์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค
  • ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ „ํ˜•์ ์ธ ํ˜•ํƒœ๋Š” ๋ณดํ…€์—… ๋ฐฉ์‹์ด๋‹ค
    • ๊ฒฐ๊ณผ ์ €์žฅ์šฉ ๋ฆฌ์ŠคํŠธ๋Š” DP ํ…Œ์ด๋ธ”์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค
  • ์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์€ ์ด์ „์— ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ๊ธฐ๋กํ•ด ๋†“๋Š” ๋„“์€ ๊ฐœ๋…์„ ์˜๋ฏธํ•œ๋‹ค
    • ๋”ฐ๋ผ์„œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์€ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๊ตญํ•œ๋œ ๊ฐœ๋…์€ ์•„๋‹ˆ๋‹ค
    • ํ•œ ๋ฒˆ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์•„ ๋†“๊ธฐ๋งŒ ํ•˜๊ณ  ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•ด ํ™œ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด: ํƒ‘๋‹ค์šด ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์†Œ์Šค์ฝ”๋“œ (Python)

# ํ•œ ๋ฒˆ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(Memoization)ํ•˜๊ธฐ ์œ„ํ•œ ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”
d = [0] * 100

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

print(fibo(99))

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด: ๋ณดํ…€์—… ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์†Œ์Šค์ฝ”๋“œ (Python)

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

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

# ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜(Fibonacci Function) ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ตฌํ˜„(๋ณดํ…€์—… ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ)
for i in range(3, n + 1):
    d[i] = d[i - 1] + d[i - 2]

print(d[n])

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด: ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋™์ž‘ ๋ถ„์„

  • ์ด๋ฏธ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ‰์น ๋œ ๋…ธ๋“œ๋งŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋‹ค

  • ์‹ค์ œ๋กœ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ๋งŒ ํ™•์ธํ•ด ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐฉ๋ฌธํ•œ๋‹ค

  • ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด ํ•จ์ˆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N) 

 

# ํ•œ ๋ฒˆ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(Memoization)ํ•˜๊ธฐ ์œ„ํ•œ ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”
d = [0] * 100

# ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜(Fibonacci Function)๋ฅผ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ (ํƒ‘๋‹ค์šด ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ)
def fibo(x):
    print('f(' + str(x) + ')', end=' ')
    # ์ข…๋ฃŒ ์กฐ๊ฑด(1 ํ˜น์€ 2์ผ ๋•Œ 1์„ ๋ฐ˜ํ™˜)
    if x == 1 or x == 2:
        return 1
    # ์ด๋ฏธ ๊ณ„์‚ฐํ•œ ์  ์žˆ๋Š” ๋ฌธ์ œ๋ผ๋ฉด ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜
    if d[x] != 0:
        return d[x]
    # ์•„์ง ๊ณ„์‚ฐํ•˜์ง€ ์•Š์€ ๋ฌธ์ œ๋ผ๋ฉด ์ ํ™”์‹์— ๋”ฐ๋ผ์„œ ํ”ผ๋ณด๋‚˜์น˜ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
    d[x] = fibo(x - 1) + fibo(x - 2)
    return d[x]

fibo(6)

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ VS ๋ถ„ํ•  ์ •๋ณต

  • ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๋ถ„ํ•  ์ •๋ณต์€ ๋ชจ๋‘ ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์งˆ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค
    • ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž‘์€ ๋ฌธ์ œ์˜ ๋‹ต์„ ๋ชจ์•„์„œ ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ
  • ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๋ถ„ํ•  ์ •๋ณต์˜ ์ฐจ์ด์ ์€ ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ์ค‘๋ณต์ด๋‹ค
    • ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฌธ์ œ์—์„œ๋Š” ๊ฐ ๋ถ€๋ถ„ ๋ฌธ์ œ๋“ค์ด ์„œ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉฐ ๋ถ€๋ถ„ ๋ฌธ์ œ๊ฐ€ ์ค‘๋ณต๋œ๋‹ค
    • ๋ถ„ํ•  ์ •๋ณต ๋ฌธ์ œ์—์„œ๋Š” ๋™์ผํ•œ ๋ถ€๋ถ„ ๋ฌธ์ œ๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ณ„์‚ฐ๋˜์ง€ ์•Š๋Š”๋‹ค
  • ๋ถ„ํ•  ์ •๋ณต์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ์ธ ํ€ต ์ •๋ ฌ์„ ์‚ดํŽด๋ณด์ž
    • ํ•œ ๋ฒˆ ๊ธฐ์ค€ ์›์†Œ(Pivot)๊ฐ€ ์ž๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ ์ž๋ฆฌ๋ฅผ ์žก์œผ๋ฉด ๊ทธ ๊ธฐ์ค€ ์›์†Œ์˜ ์œ„์น˜๋Š” ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค
    • ๋ถ„ํ•  ์ดํ›„์— ํ•ด๋‹น ํ”ผ๋ฒ—์„ ๋‹ค์‹œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ๋Š” ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค


๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฌธ์ œ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ์ฃผ์–ด์ง„ ๋ฌธ์ œ๊ฐ€ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์œ ํ˜•์ž„์„ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค
  • ๊ฐ€์žฅ ๋จผ์ € ๊ทธ๋ฆฌ๋””, ๊ตฌํ˜„, ์™„์ „ ํƒ์ƒ‰ ๋“ฑ์˜ ์•„์ด๋””์–ด๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ๋‹ค
    • ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ’€์ด ๋ฐฉ๋ฒ•์ด ๋– ์˜ค๋ฅด์ง€ ์•Š์œผ๋ฉด ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ณ ๋ คํ•ด ๋ณด์ž
  • ์ผ๋‹จ ์žฌ๊ท€ ํ•จ์ˆ˜๋กœ ๋น„ํšจ์œจ์ ์ธ ์™„์ „ ํƒ์ƒ‰ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•œ ๋’ค์— (ํƒ‘๋‹ค์šด) ์ž‘์€ ๋ฌธ์ œ์—์„œ ๊ตฌํ•œ ๋‹ต์ด
    ํฐ ๋ฌธ์ œ์—์„œ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉด, ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค
  • ์ผ๋ฐ˜์ ์ธ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ์ˆ˜์ค€์—์„œ๋Š” ๊ธฐ๋ณธ ์œ ํ˜•์˜ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฌธ์ œ๊ฐ€ ์ถœ์ œ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค

 

 

 

 

 

์ถœ์ฒ˜ : https://freedeveloper.tistory.com/276

 

[์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค] 6. ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ

www.youtube.com/watch?v=5Lu34WIx2Us&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=6 ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋™์  ๊ณ„ํš๋ฒ•์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค ์ผ๋ฐ˜์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ถ„์•ผ์—์„œ์˜ ๋™์ (Dynamic)..

freedeveloper.tistory.com