[์•Œ๊ณ ๋ฆฌ์ฆ˜] Dynamic Programming(๋™์  ๊ณ„ํš๋ฒ•)& Divide and Conquer(๋ถ„ํ•  ์ •๋ณต)

2021. 9. 9. 08:00ใ†์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ์ค€๋น„/์•Œ๊ณ ๋ฆฌ์ฆ˜

728x90
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š”? ์ฃผ๋‹ˆํ•˜๋ž‘ ์ž…๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ๋™์  ๊ณ„ํš๋ฒ•๊ณผ ๋ถ„ํ•  ์ •๋ณต์— ๋Œ€ํ•ด ๊ณต๋ถ€ ํ•ด ๋ณด๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

์†Œ์Šค ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ํ™•์ธ ํ•˜๊ณ  ์‹ถ์œผ์‹  ๋ถ„๋“ค๊ป˜์„œ๋Š” ์ฃผ๋‹ˆํ•˜๋ž‘์˜ Git hub์— ๊ด€์‹ฌ์„ ์ฃผ์„ธ์š”!




 


 

 

๐Ÿ“Œ ๊ฐœ์š”


 

    ๐Ÿ“๋™์  ๊ณ„ํš๋ฒ•์ด๋ž€?


Dynamic Programming์„ ์ค„์—ฌ์„œ DP๋ผ๊ณ  ๋งŽ์ด ๋ถ€๋ฅธ๋‹ค๊ณ  ํ•ด์š”!

๋™์  ๊ณ„ํš๋ฒ•์€ ์ž…๋ ฅ ํฌ๊ธฐ๊ฐ€ ์ž‘์€ ๋ถ€๋ถ„ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•œ ๋’ค, ํ•ด๋‹น ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ํ•ด(๋‹ต)์„ ํ™œ์šฉํ•˜์—ฌ ๋ณด๋‹ค ํฐ ํฌ๊ธฐ์˜ ๋ถ€๋ถ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ์œผ๋กœ, ์ตœ์ •์ ์œผ๋กœ ์ „์ฒด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ ๊ฒƒ์ด์—์š”.

๋™์  ๊ณ„ํš๋ฒ•์€ ์ƒํ–ฅ์‹ ์ ‘๊ทผ๋ฒ•์œผ๋กœ, ๊ฐ€์žฅ ์ตœํ•˜์œ„ ํ•ด๋‹ต์„ ๊ตฌํ•œ ๋’ค, ์ด๋ฅผ ์ €์žฅํ•˜๊ณ , ํ•ด๋‹น ๊ฒฐ๊ณผ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ์ƒ์œ„ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๊ฐ€๋Š” ๊ฒƒ์ด์—์š”.
๋˜ํ•œ, ๋ฌธ์ œ๋ฅผ ์ž˜๊ฒŒ ์ชผ๊ฐค ๋•Œ, ๋ถ€๋ถ„ ๋ฌธ์ œ๋Š” ์ค‘๋ณต์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์žฌํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ต๋‹ˆ๋‹ค!

  • ๋ฌธ์ œ์˜ ์˜ˆ : ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด

 

          ๐Ÿ‘‰ Memoizaion ๊ธฐ๋ฒ• ํ™œ์šฉ

  • Memoization(๋ฉ”๋ชจ์ด์ œ์ด์…˜) : ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ ์ด์ „์— ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ์ €์žฅ. ์ด๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋„๋ก ๋‹ค์Œ ๊ณ„์‚ฐ์—์„œ ์ด ์ €์žฅํ•œ ๊ฐ’์„ ํ™œ์šฉํ•˜์—ฌ ์—ฐ์‚ฐ์„ ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ์ „์ฒด ์‹คํ–‰ ์†๋„๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•˜๋ ค๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ 

 

 

    ๐Ÿ“๋ถ„ํ•  ์ •๋ณต์ด๋ž€?

 

๋ถ„ํ•  ์ •๋ณต์€ ๋ฌธ์ œ๋ฅผ ๋‚˜๋ˆŒ ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋‚˜๋ˆ„์–ด์„œ ๊ฐ๊ฐ์„ ํ’€๋ฉด์„œ ๋‹ค์‹œ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ํ•ฉ๋ณ‘ํ•˜์—ฌ ๋ฌธ์ œ์˜ ๋‹ต์„ ์–ป๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ ๊ฒƒ์ด์—์š”.

ํ•˜์–‘์‹ ์ ‘๊ทผ๋ฒ•์œผ๋กœ, ์ƒ์œ„์˜ ํ•ด๋‹ต์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด, ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ€๋ฉด์„œ ํ•˜์œ„์˜ ํ•ด๋‹ต์„ ๊ตฌํ•˜๋Š” ๋ฐฉ์‹์ด๋ž๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

๋˜ํ•œ, ๋ฌธ์ œ๋ฅผ ์ž˜๊ฒŒ ์ชผ๊ฐค ๋•Œ, ๋ถ€๋ถ„ ๋ฌธ์ œ๋Š” ์„œ๋กœ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

 

    ๐Ÿ“๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ 

 

 

          ๐Ÿ‘‰ ๊ณตํ†ต์ 

๋ฌธ์ œ๋ฅผ ์ž˜๊ฒŒ ์ชผ๊ฐœ์–ด ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„๋กœ ๋ถ„ํ•  ์‹œํ‚ค๋Š” ์ 

 

        ๐Ÿ‘‰ ์ฐจ์ด์ 

  1. ๋™์  ๊ณ„ํš๋ฒ•
    • ๋ถ€๋ถ„ ๋ฌธ์ œ๋Š” ์ค‘๋ณต๋˜์–ด, ์ƒ์œ„ ๋ฌธ์ œ ํ•ด๊ฒฐ ์‹œ ์žฌํ™œ์šฉ
    • Memoization ๊ธฐ๋ฒ• ํ™œ์šฉ (๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ํ•ด๋‹ต์„ ์ €์žฅํ•˜์—ฌ ์žฌํ™œ์šฉํ•˜๋Š” ์ตœ์ ํ™” ๊ธฐ๋ฒ• ์‚ฌ์šฉ)
  2. ๋ถ„ํ•  ์ •๋ณต
    • ๋ถ€๋ถ„ ๋ฌธ์ œ๋Š” ์„œ๋กœ ์ค‘๋ณต๋˜์ง€ ์•Š์Œ
    • Memoization ๊ธฐ๋ฒ• ํ™œ์šฉ ํ•˜์ง€ ์•Š์Œ

 

 

 

 

๐Ÿ“Œ ๋™์  ๊ณ„ํš๋ฒ• ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ดํ•ด


 

    ๐Ÿ“ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์ด๋ž€?

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด ์•ž์— ํ•ญ๊ณผ ๋’ค์— ํ•ญ์„ ๋”ํ•˜์—ฌ ๋‹ค์Œ ํ•ญ์— ์ ๊ณ , ๊ทธ๊ฒƒ์„ ๋‹ค์‹œ ์•ž์— ํ•ญ๊ณผ ์ž์‹ ์˜ ํ•ญ์„ ๋”ํ•˜์—ฌ ๋’ค์— ์ ์Œ์„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์ด์—์š”. ์ด๋ฅผ ๊ณต์‹์œผ๋กœ ํ‘œํ˜„ํ•˜์ž๋ฉด $F0โ€‹=0, F1โ€‹=1, Fn+2โ€‹=Fn+1โ€‹+Fnโ€‹$ ์ด๋ ‡๊ฒŒ ์ ํ™”์‹์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

 

 

๋จผ์ € 0๋ฒˆ์งธ์™€ 1๋ฒˆ์งธ๋Š” ๋ฌด์กฐ๊ฑด 0๊ณผ 1์ด ๋‚˜์˜ค๋Š” ๊ฒƒ์ด์—์š”.

๊ทธ๋Ÿฐ ๋’ค 2๋ฒˆ์งธ ๋ถ€ํ„ฐ๋Š” ์•ž์— ํ•ญ๊ณผ ์•ž์— ์ „์˜ํ•ญ์„ ๋”ํ•œ ๋’ค ๊ทธ๊ฒƒ์„ ์•ž์— ํ•ญ ๋’ค์— ์ ์–ด์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด์—์š”.

 

์ด๊ฒƒ์„ ํ•จ์ˆ˜๋กœ ํ‘œํ˜„ํ•ด๋ณด๊ณ ์ž ํ•  ๋•Œ, fibonacci๋ผ๊ณ  ํ•œ๋‹ค๋ฉด

fibonacci(0):0
fibonacci(1):1
fibonacci(2):1
fibonacci(3):2
fibonacci(4):3
fibonacci(5):5
fibonacci(6):8
fibonacci(7):13
fibonacci(8):21
fibonacci(9):34

 

 

์œ„์˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋งŒ์•ฝ ํ•จ์ˆ˜์— 6์ด๋ผ๋Š” ๊ฐ’์„ ๋„ฃ์—ˆ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

6์€ ํ•จ์ˆ˜(4)์™€ ํ•จ์ˆ˜(5)๋กœ ์ชผ๊ฐค ์ˆ˜ ์žˆ๊ฒŒ ๋  ๊ฒƒ์ด๊ณ , ๋˜ ํ•จ์ˆ˜(4)๋Š” ํ•จ์ˆ˜ (2)์™€ ํ•จ์ˆ˜ (3)์œผ๋กœ, ์ญ‰์ญ‰ ์ชผ๊ฐœ์ง€๊ฒŒ ๋  ๊ฒƒ์ด์—์š”.

 

### recursive Call ํ™œ์šฉ
def fibonacciRec(num):
    if num <= 1:
        return num

    return fibonacciRec(num - 1) + fibonacciRec(num - 2)


print(fibonacciRec(4))

# ๊ฒฐ๊ณผ๊ฐ’ : 3

 

๋จผ์ € 4๋ฅผ ์ž…๋ ฅํ•˜๊ฒŒ ๋˜๋ฉด num(4)๋Š” 1๋ณด๋‹ค ํฌ๊ธฐ ๋•Œ๋ฌธ์— return๋ฌธ์œผ๋กœ ๋ฐ”๋กœ ๊ฐˆ ๊ฒƒ์ด์—์š”.

return๋ฌธ์€ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด fibonacciRec ํ•จ์ˆ˜์— num - 1 ์ฆ‰, 4 - 1์„ ํ•ด์„œ ํ˜ธ์ถœ์ด ๋˜๊ณ , ๋˜, num - 2 ์ฆ‰, 4 - 2๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ๋‹ต๋‹ˆ๋‹ค.

์œ„์—์„œ ์ด์•ผ๊ธฐ ํ–ˆ๋“ฏ ํ•จ์ˆ˜(4)๋ฅผ ๋‘ ๊ฐœ๋กœ ์ชผ๊ฐ  ๊ฒƒ์ด๊ณ , ํ•จ์ˆ˜(2)์™€ ํ•จ์ˆ˜(3)์ด ํ˜ธ์ถœ๋˜๋ฉด์„œ ์ชผ๊ฐœ์ง€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

๊ทธ๋ ‡๊ฒŒ 3๊ณผ 2๊ฐ€ ๊ฐ๊ฐ ๋˜ num์œผ๋กœ ๋“ค์–ด๊ฐ€์„œ ์ชผ๊ฐœ์ง€๊ธฐ๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์ด๋ž๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ ๋’ค ๋ฐ˜ํ™˜๋  ๋•Œ ์ด ๊ฐ’๋“ค์ด ๋”ํ•ด์ง€๋ฉด์„œ ๊ฐ’์ด ๋‚˜์˜ค๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์—์š”.

 

 

### ๋™์  ๊ณ„ํš๋ฒ•(Dynamic Programming) ํ™œ์šฉ

def fibonacci_dp(num):
    cache = [0 for index in range(num + 1)]
    cache[0] = 0
    cache[1] = 1

    for index in range(2, num + 1):
        cache[index] = cache[index - 1] + cache[index - 2]

    print(cache)
    return cache[num]


print(fibonacci_dp(10))


# ๊ฒฐ๊ณผ๊ฐ’ : 55

 

์ข€ ๋” ๋ณด๊ธฐ ์‰ฝ๊ฒŒ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์—ฌ๊ธฐ๋ฅผ ํด๋ฆญํ•˜์…”์„œ ํ•ด ๋ณด์‹ค ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค!

728x90
๋ฐ˜์‘ํ˜•