Algorithm๐Ÿฅ‡

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐœ๋… - ๋™์  ๊ณ„ํš๋ฒ•(DP)

hae02y 2023. 10. 24. 12:20
๋ฐ˜์‘ํ˜•

DP Algorithm

"๋™์ ๊ณ„ํš๋ฒ•(Dynamic Programming)์ด๋ž€ ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด ํ‘ธ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค."

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

 

์ด๋Ÿฌํ•œ DP๋Š” ๋ถ„ํ• ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ๋„ ๋‹ฎ์€ ๋ถ€๋ถ„์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ถ„ํ• ์ •๋ณต์—์„œ๋Š” ๋ถ€๋ถ„๋ฌธ์ œ์˜ ๊ณ„์‚ฐ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํ™œ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๊ฒƒ์ด DP์™€ ๋ถ„ํ• ์ •๋ณต์˜ ์ฐจ์ด์ด๊ณ , ๊ณ„์‚ฐ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ด๋‘๊ณ  ํ™œ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„๋ณต์žก๋„ ๋ฉด์—์„œ DP๊ฐ€ ์œ ๋ฆฌํ•˜๋‹ค.

 

DP ์‚ฌ์šฉ์ด์œ 

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

 

์˜ˆ๋ฅผ๋“ค์–ด ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ์‚ดํŽด๋ณด๋ฉด

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 ...

 

ํ”ผ๋ณด๋‚˜์น˜์ˆ˜๋ฅผ ๊ตฌํ•˜๊ณ  ์‹ถ์„๋•Œ ์žฌ๊ท€๋กœ ํ•จ์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด

return f(n) = f(n-1) + f(n-2) (n > 2)

 

์ด๋•Œ, f(n-1), f(n-2)์—์„œ ํ•จ์ˆ˜๋ฅผ 1๋ฒˆ์”ฉ ํ˜ธ์ถœํ•˜๋ฉด, ๋™์ผํ•œ ๊ฐ’์„ 2๋ฒˆ์”ฉ ๊ตฌํ•˜๊ฒŒ ๋œ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด 100๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜์ˆ˜๋ฅผ ๊ตฌํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด... ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์ธ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์ด ์ผ์–ด๋‚œ๋‹ค.

์ž ๊ทธ๋Ÿผ ์—ฌ๊ธฐ์„œ DP์˜ ํšจ์œจ์„ฑ์„ ๋ณผ์ˆ˜์žˆ๋‹ค. ์œ„์˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์ž‘์€ ๋ฌธ์ œ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ค‘๋ณต๋˜๋Š”๊ฒƒ์„ ๋ณผ์ˆ˜์žˆ๊ณ , ์ด๋ฅผ ์ €์žฅํ•ด๋†“๊ณ  ์žฌ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์•ž์—์„œ ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ๋ฐ˜๋ณตํ• ํ•„์š”๊ฐ€ ์—†์–ด, ํ›จ์”ฌ ์ ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๊ณ„์‚ฐ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

 

๋งค์šฐ ํšจ์œจ์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ• ์ˆ˜์žˆ๋Š”๋ฐ, ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ณด๋ฉด 

O(n^2) > O(f(n)) ์œผ๋กœ ๊ฐœ์„  (๋‹คํ•ญ์‹ ์ˆ˜์ค€, ๋ฌธ์ œ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.) ๊ฐ€๋Šฅํ•˜๋‹ค.

 

DP์˜ ์‚ฌ์šฉ์กฐ๊ฑด

  • Overlapping Subproblems(๊ฒน์น˜๋Š” ๋ถ€๋ถ„๋ฌธ์ œ)
  • Optimal Substructure(์ตœ์  ๋ถ€๋ถ„๊ตฌ์กฐ)

1. Overlapping Subproblems(๊ฒน์น˜๋Š” ๋ถ€๋ถ„๋ฌธ์ œ)

DP๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ๋‚˜๋ˆ„๊ณ  ๊ทธ ๋ฌธ์ œ์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ์žฌํ™œ์šฉํ•ด์„œ ๋‹ต์„ ๊ตฌํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋™์ผํ•œ ์ž‘์€ ๋ฌธ์ œ๋“ค์ด ๋ฐ˜๋ณตํ•˜์—ฌ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๋‹ค์‹œ๋งํ•ด์„œ DP๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜์—ฌ ์žฌ ๊ณ„์‚ฐํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š”๋ฐ, ๋ถ€๋ถ„๋ฌธ์ œ๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋‚˜ํƒ€๋‚˜์ง€์•Š์œผ๋ฉด ์žฌ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์—ฌ ๋ถ€๋ถ„๋ฌธ์ œ๊ฐ€ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š”๊ฒฝ์šฐ์—๋Š” ์‚ฌ์šฉํ• ์ˆ˜๊ฐ€ ์—†๋‹ค.

 

์˜ˆ๋ฅผ๋“ค์–ด ์ด์ง„ํƒ์ƒ‰๊ณผ ํ”ผ๋ณด๋‚˜์น˜์ˆ˜์—ด์„ ๋น„๊ตํ•ด๋ณด์ž.

 

์ด์ง„ํƒ์ƒ‰์˜ ๊ฒฝ์šฐ๋Š” ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์•ˆ์—์„œ ์œ„์น˜๋ฅผ ์ฐพ๊ธฐ๋•Œ๋ฌธ์— ์œ„์น˜๋ฅผ ์ฐพ์€ํ›„ ๋ฐ˜ํ™˜ํ• ๋ฟ, ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ ํ”ผ๋ณด๋‚˜์น˜์ˆ˜์—ด์€ ์•„๋ž˜์™€ ๊ฐ™์ด ํŠธ๋ฆฌ๊ตฌ์กฐ๋กœ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

๊ทธ๋ฆผ์—์„œ ๋ณด๋‹ค์‹œํ”ผ f(3), f(2), f(1), f(0) ์ฒ˜๋Ÿผ ๋™์ผํ•œ ๋ถ€๋ถ„๋ฌธ์ œ๊ฐ€ ์ค‘๋ณต๋œ๋‹ค. ์ด๋ ‡๊ฒŒ 1ํšŒ๋งŒ ๊ณ„์‚ฐํ•œ๋’ค ๊ทธ๋’ค๋กœ๋Š” ์ €์žฅํ•˜์—ฌ ๊ฐ’์„ ์žฌํ™œ์šฉ ํ•˜๋Š”๊ฒƒ์ด๋‹ค.

 

 

 

2.Optimal Substructure(์ตœ์  ๋ถ€๋ถ„๊ตฌ์กฐ)

๋ถ€๋ถ„๋ฌธ์ œ์˜ ์ตœ์  ๊ฒฐ๊ณผ๊ฐ’์„ ์‚ฌ์šฉํ•ด ์ „์ฒด๋ฌธ์ œ์˜ ์ตœ์ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ผ์ˆ˜์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.์ด๋ ‡๊ฒŒ ๋˜๋ฉด ํŠน์ • ๋ฌธ์ œ์˜ ์ •๋‹ต์€ ๋ฌธ์ œ์˜ ํฌ๊ธฐ์™€ ์ƒ๊ด€์—†์ด ๋™์ผํ•˜๋‹ค.

 

A - B ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ , ์ค‘๊ฐ„์— X๊ฐ€ ์žˆ๋‹ค. ์ผ๋‹จ ๊ทธ๋ฆผ์„ ์‚ดํŽด๋ณด์ž.

๊ทธ๋ฆผ์—์„œ A-X / X-B ๊ฐ€ ๋งŽ์€ ๊ฒฝ๋กœ์ค‘์— ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ๋ผ๋ฉด ์ „์ฒด ์ตœ์ ์˜ ๊ฒฝ๋กœ๋„ A - X - B ๊ฐ€ ๋œ๋‹ค.

 

๋‹ค์‹œ๋งํ•ด์„œ, ๊ทธ๋ฆผ์—์„œ ๋ณผ๋•Œ A -X ์‚ฌ์ด์˜ ์ตœ๋‹จ๊ฒฝ๋กœ๋Š” AX2 ์ด๊ณ , B - X ์‚ฌ์ด์˜ ์ตœ๋‹จ๊ฒฝ๋กœ๋Š” BX2 ์ด๋‹ค. ๋งŒ์•ฝ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋ฅผ ํƒํ•ด๋„ A - X - B ๋ผ๋Š” ์ตœ๋‹จ๊ฒฝ๋กœ๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด์ฒ˜๋Ÿผ ๋ถ€๋ถ„๋ฌธ์ œ์—์„œ ๊ตฌํ•œ ์ตœ์ ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ „์ฒด ๋ฌธ์ œ์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋˜์–ด ๊ฒฐ๊ณผ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š์„๋•Œ DP๋ฅผ ์‚ฌ์šฉํ• ์ˆ˜์žˆ๋‹ค.

 

DP ์‚ฌ์šฉ ๊ณผ์ •

DP๋Š” ๋‹ค์–‘ํ•œ ๋ฌธ์ œํ•ด๊ฒฐ์— ์‚ฌ์šฉ๋ ์ˆ˜์žˆ๋‹ค. ์ฆ‰, ์ ์šฉํ• ์ˆ˜์žˆ๋Š” ๋ฌธ์ œ์ธ์ง€ ํŒ๋ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๊ณ  ๊ทธ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

  • DP๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ธ์ง€ ํ™•์ธํ•œ๋‹ค. - ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜๋Š”์ง€ ํ™•์ธ
  • ๋ฌธ์ œ๊ฐ„์˜ ๋ณ€์ˆ˜๋ฅผ ํŒŒ์•…ํ•œ๋‹ค. 
  • ๋ณ€์ˆ˜๊ฐ„ ๊ด€๊ณ„์‹์„ ๋งŒ๋“ ๋‹ค.(์ ํ™”์‹) - ํ”ผ๋ณด๋‚˜์น˜์—์„œ f(n) = f(n-1) + f(n-2) ์ฒ˜๋Ÿผ...!
  • ๋ฉ”๋ชจํ•œ๋‹ค.(momoization or tabulation) - ๋ณ€์ˆ˜์˜ ๊ฐ’์— ๋”ฐ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ
  • ๊ธฐ์ € ์ƒํƒœ๋ฅผ ํŒŒ์•…ํ•œ๋‹ค. - ๊ฐ€์žฅ์ž‘์€ ๋ฌธ์ œ์˜ ์ƒํƒœ๋ฅผ ํŒŒ์•…, ํ”ผ๋ณด๋‚˜์น˜์—์„œ f(0) = 0, f(1) = 1 ์ฒ˜๋Ÿผ...
  • ๊ตฌํ˜„ํ•œ๋‹ค. - Buttom-up(๋ฐ˜๋ณต๋ฌธ) , Top-down(์žฌ๊ท€)

 

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

1. Bottom-Up ๋ฐฉ์‹(Tabulation)

์ด๋ฆ„์ฒ˜๋Ÿผ ์•„๋ž˜์—์„œ๋ถ€ํ„ฐ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ˆ„์ ์‹œ์ผœ ์ „์ฒด์˜ ํฐ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋ฉ”๋ชจ๋ฅผ ์œ„ํ•ด์„œ dp๋ผ๋Š” ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ  ์ด๊ฒƒ์„ 1์ฐจ์›์ด๋ผ๊ณ  ๊ฐ€์ •ํ–ˆ์„๋•Œ, dp[0]๊ฐ€ ๊ธฐ์ €์ƒํƒœ์ด๊ณ , dp[n]์„ ๋ชฉํ‘œ์ƒํƒœ๋กœ ๋ณด์ž. Buttom-up ๋ฐฉ์‹์€ dp[0]๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ์ ํ™”์‹์„ ๋„์ถœํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋‚ด์–ด dp[n]๊นŒ์ง€ ๊ฐ’์„ ์žฌํ™œ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋ณดํ†ต ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ’€๊ณ , ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.

	public static int bottomUp(int num) { //bottom-up dp
    	
        //๊ธฐ์ €์ƒํƒœ๋ฅผ ์‚ฌ์ „์— ๋ฏธ๋ฆฌ ์ €์žฅ
		dp[0] = 0;
		dp[1] = 1;
        
        //๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ”์„ ์ฑ„์›Œ๊ฐ„๋‹ค.
		for( int i = 2 ; i <= num ; i++) {
			dp[i] = dp[i-1] + dp[i-2];
		}
        
		return dp[num];
	}

์—ฌ๊ธฐ์„œ์˜ tabulation์€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜๊ณผ ๊ฐ™๋‹ค. ๋ฉ”๋ชจ๋ฅผ ์œ„ํ•œ ์ €์žฅ๊ฐ’์ธ๋ฐ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉด์„œ dp[0]๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ์ฑ„์šฐ๋Š” ๊ณผ์ •์„ table-filling ์ด๋ผ๊ณ  ํ•˜๊ณ  ์ด Table์— ์ €์žฅ๋œ ๊ฐ’์— ์ง์ ‘ ์ ‘๊ทผํ•˜์—ฌ ํ™œ์šฉํ•˜๋ฏ€๋กœ Tabulation ์ด๋ผ๋Š” ๋ช…์นญ์ด ๋ถ™์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค.

 

 

2. Top-down ๋ฐฉ์‹(Memoization)

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

 

ํ”ผ๋ณด๋‚˜์น˜์˜ ์˜ˆ์‹œ์—์„œ์˜ ํŠธ๋ฆฌ์—์„œ ๋ดค๋“ฏ์ด, n=5์ผ๋•Œ f(3), f(2) ... ๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค. ์ด๋•Œ ์ด๋ฏธ ๊ณ„์‚ฐ์ด ์™„๋ฃŒ๋œ ๋ถ€๋ถ„๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ๋‹ค์‹œ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๋‚ด์—ญ์„ ๊บผ๋‚ด์„œ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ์ดํ•ดํ•ด๋ณด์ž.

public static int topDown(int num) {
		
        //๊ธฐ์ € ์ƒํƒœ ๋„๋‹ฌ์‹œ 0,1๋กœ ์ดˆ๊ธฐํ™”
        if( num <= 0 )return 0;
	else if ( num ==1) return 1;
        
       //๋ฉ”๋ชจ์— ๊ณ„์‚ฐ๋œ ๊ฐ’์ด ์žˆ์œผ๋ฉด ๋ฐ”๋กœ ๋ฐ˜ํ™˜
	if(memo[num]!=0) {
		return memo[num];
	}
        
       //์žฌ๊ท€๋ฅผ ์‚ฌ์šฉ
	memo[num] = topDown(num-1) + topDown(num-2);
       
	return memo[num];
}

 

 

 

Ref.

๋ฐ˜์‘ํ˜•