๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“š Algorithm/Algorithm Note

Dynamic Programming(DP) ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ๋™์ ํ”„๋กœ๊ทธ๋ž˜๋ฐ, Python์œผ๋กœ ํ‘ธ๋Š” ํ”ผ๋ณด๋‚˜์น˜

Dynamic Programming 

ํฐ ๋ฌธ์ œ๋ฅผ ๋‚˜๋ˆ„์–ด ์ž‘์€ ๋ฌธ์ œ๋กœ ํ‘ธ๋Š” ๊ฒƒ 

ํ•˜๋‚˜์˜ ๋ฌธ์ œ๋Š” ๋‹จ ํ•œ ๋ฒˆ์˜ ํ’€์ด๋งŒ ํ•œ๋‹ค. 

 

 

Dynamic Programming ๊ณผ Recursion(์žฌ๊ท€)์˜ ์ฐจ์ด์  

DP์™€ ์žฌ๊ท€๋Š” ์–ผํ•๋ณด๋ฉด '๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ผ์–ด๋‚˜๋Š” ์ ' ์—์„œ ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ, ํฐ ์ฐจ์ด์ ์€ ์ผ๋ฐ˜์ ์ธ ์žฌ๊ท€๋ฅผ ๋‹จ์ˆœํžˆ ์‚ฌ์šฉํ•˜๋ฉด  ๋™์ผํ•œ ์ž‘์€ ๋ฌธ์ œ๋“ค์ด ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณต ๋˜์–ด ๋น„ํšจ์œจ์ ์ธ ๊ณ„์‚ฐ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๋Š” ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜์ด๋‹ค. 



DP ์กฐ๊ฑด

๋‘ ๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค.

1. ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ฐœ์ƒ

2. ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ 

๋™์ผํ•œ ์ž‘์€ ๋ฌธ์ œ๋“ค์ด ๋ฐ˜๋ณต์ ์œผ๋กœ ์ผ์–ด๋‚  ๋•Œ, ๊ฐ™์€ ๋ฌธ์ œ๋Š” ํ•ญ์ƒ ์ •๋‹ต๋„ ๊ฐ™๋‹ค. ์ฆ‰, ์ค‘๋ณต ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

 

DP ๋ฌธ์ œ ํ’€์ด ๋ฐฉ๋ฒ•

๋ชจ๋“  ์ž‘์€ ๋ฌธ์ œ๋Š” ํ•œ ๋ฒˆ๋งŒ ํ’€์–ด์•ผ ํ•œ๋‹ค.

์ดํ›„ ํฐ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ ๋˜‘๊ฐ™์€ ์ž‘์€ ๋ฌธ์ œ๊ฐ€ ์ผ์–ด๋‚˜๋ฉด ์•ž์„œ ํ’€์—ˆ๋˜ ๊ฒƒ์„ ์ด์šฉํ•˜์—ฌ ํ‘ผ๋‹ค.

dp[0], dp[1], dp[2], dp[3] ์ด๋ ‡๊ฒŒ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋‹ค ๋ณด๋ฉด ๊ทœ์น™์„ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋œ๋‹ค. 

๋•Œ๋ฌธ์— dp[4]๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ ์ฆˆ์Œ์—๋Š” ์ด์ „์— ๊ตฌํ•ด๋†“์€ ์ž‘์€ ๋ฌธ์ œ๋“ค์ธ dp[0],dp[1],dp[2],dp[3]์„ ์ด์šฉํ•ด ์ ํ™”์‹์„ ๋„์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

[1] DP๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ธ์ง€ ํ™•์ธ
[2] ๋ฌธ์ œ์˜ ๋ณ€์ˆ˜ ํŒŒ์•…
[3] ๋ณ€์ˆ˜ ๊ฐ„ ๊ด€๊ณ„์‹ ๋งŒ๋“ค๊ธฐ (์ ํ™”์‹)
[4] ๋ฉ”๋ชจํ•˜๊ธฐ memoization
[5] ๊ธฐ์ € ์ƒํƒœ ํŒŒ์•…ํ•˜๊ธฐ
[6] ๊ตฌํ˜„ํ•˜๊ธฐ 

 

DP ๊ตฌํ˜„ ๋ฐฉ๋ฒ• 

DP๋Š” 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

1. Bottom-Up : ๋ฐ˜๋ณต๋ฌธ ์‚ฌ์šฉ

์•„๋ž˜์—์„œ๋ถ€ํ„ฐ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ˆ„์ ์‹œ์ผœ ์ „์ฒด์ ์ธ ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์œ„์—์„œ ์ž ๊น ์„ค๋ช…ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ dp[0]๋ถ€ํ„ฐ dp[n-1]๊นŒ์ง€์˜ ๊ฐ’์„ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•ด์„œ ์ ํ™”์‹์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋‚ธ๋‹ค. 

 

 

2. Top-Down : ์žฌ๊ท€ ์‚ฌ์šฉ 

์œ„์—์„œ๋ถ€ํ„ฐ ํ˜ธ์ถœ์„ ์‹œ์ž‘ํ•ด dp[0]๊นŒ์ง€ ๋‚ด๋ ค๊ฐ€ ๊ฒฐ๊ณผ ๊ฐ’์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ํ”ผ๋ณด๋‚˜์น˜ ๋ฌธ์ œ๊ฐ€ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ด๋‹ค.

f(n) = f(n-1) + f(n-2) ์˜ ์‹๊ณผ ๊ฐ™์ด ๋™์ผํ•œ ๊ณ„์‚ฐ์ด ๋ฐ˜๋ณต์ ์œผ๋กœ ๋‚˜์˜ค๋ฉด์„œ ์œ„์—์„œ๋ถ€ํ„ฐ ํ˜ธ์ถœ์„ ํ•œ๋‹ค. 

 

 

 

 

DP์˜ ์žฅ์ 

๋™์ ๊ณ„ํš๋ฒ•์„ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ํ•ด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. 

์ง€์ˆ˜ ๋ณต์žก๋„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋‹คํ•ญ ์‹œ๊ฐ„์œผ๋กœ ์ค„์—ฌ์ฃผ๊ธฐ๋„ ํ•˜๊ณ , ๊ฐ™์€ ๋‹คํ•ญ ์‹œ๊ฐ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋„ ์ฐจ์ˆ˜๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค.

 

DP ์˜ˆ์‹œ 

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฌ๊ท€์˜ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง„๋‹ค. 
f(0) = 1
f(1) = 1
f(n) = f(n-1) + f(n-2) when n > 1

Dynamic Programming์„ ์ด์šฉํ•˜์—ฌ, ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ๋‚˜ํƒ€๋‚ด์–ด๋ผ 

 

Python์œผ๋กœ ํ’€๊ธฐ 

memo = [0 for i in range(100)]  #๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ณต๊ฐ„. ์ „์—ญ ๋ณ€์ˆ˜์ด๋ฏ€๋กœ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
memo[0] = 0
memo[1] = 1

def fibonacci(n) :
  if memo[n]!=0 :#๋ฉ”๋ชจ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ(0์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์—ˆ์œผ๋ฏ€๋กœ 0์ด ์•„๋‹ˆ๋ผ๋ฉด ๋ฉ”๋ชจ๊ฐ€ ์“ฐ์ธ ๊ฒƒ์ž„)
    return memo[n]  #๋ฉ”๋ชจ ๋ฆฌํ„ด
  memo[n]=fibonacci(n-1) + fibonacci(n-2) #์ž‘์€ ๋ฌธ์ œ๋กœ ๋ถ„ํ• 
  return memo[n]

 

 

 

728x90