๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐Ÿ–ฅ dev-ruby

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋™์ ๊ณ„ํš๋ฒ•(Dynamic Programming, DP) ์ด๋ž€? ๋ณธ๋ฌธ

algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋™์ ๊ณ„ํš๋ฒ•(Dynamic Programming, DP) ์ด๋ž€?

ruby_s 2021. 12. 21. 16:34
728x90
๋ฐ˜์‘ํ˜•
SMALL

๋™์ ๊ณ„ํš๋ฒ•(Dynamic Programming)์€

ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด ํ‘ธ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

dp์˜ ํ•ต์‹ฌ์€ "๋ฉ”๋ชจ์ด์ œ์ด์…˜" ๊ธฐ๋ฒ•์ธ, ์ด๋ฏธ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜์—ฌ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

์ž‘์€ ๋ฌธ์ œ๋“ค์ด ๊ณ„์† ๋ฐ˜๋ณต๋˜๊ณ , ๊ทธ ์ž‘์€ ๋ฌธ์ œ์˜ ๊ฒฐ๊ด๊ฐ’์€ ํ•ญ์ƒ ๊ฐ™์„ ๋•Œ DP ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ๋“ค ์ˆ˜ ์žˆ๋‹ค.

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ์‚ดํŽด๋ณด์ž. ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
1,  1,  2,  3,  5,  8,  13,  21,  34,  55,  89,  144 ...

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ๊ตฌํ•  ๋•Œ๋Š” ์žฌ๊ท€๋ฅผ ์“ด๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด์ „ ๊ฒฐ๊ณผ์™€ ์ „์ „ ๊ฒฐ๊ณผ์˜ ํ•ฉ์œผ๋กœ ๊ณ„์† ๊ตฌํ•ด๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์ด๋‹ค.

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

๊ทธ๋Ÿฐ๋ฐ, 100๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•  ๊ฒฝ์šฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•œ๋‹ค.

5๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•  ๋•Œ, f(3), f(2), f(1) ์™€ ๊ฐ™์ด ๊ฐ™์€ ์—ฐ์‚ฐ์„  ์—ฌ๋Ÿฌ๋ฒˆ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋œ๋‹ค.

์—ฌ๊ธฐ์„œ, dp๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด O(n^2) → O(f(n)) ๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ์ค„์–ด๋“ค๊ฒŒ ๋œ๋‹ค. (๋‹คํ•ญ์‹ ์ˆ˜์ค€์œผ๋กœ, ๋ฌธ์ œ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.)

 

DP ์ ์šฉ์กฐ๊ฑด

dp๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด 2๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค.

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

 

1. Overlapping Subproblems

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

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

 

2. Optimal Substructure

๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ์ตœ์  ๊ฒฐ๊ณผ ๊ฐ’์„ ์‚ฌ์šฉํ•ด ์ „์ฒด ๋ฌธ์ œ์˜ ์ตœ์  ๊ฒฐ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

ํŒŒ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ๋™์ ๊ณ„ํš๋ฒ•์œผ๋กœ ๊ตฌํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

1. Top-down

๋ฌธ์ œ ํ’€์ด๊ฐ€ ์œ„์—์„œ ์•„๋ž˜๋กœ ์ง„ํ–‰๋œ๋‹ค.

let fiboData = new Array(100).fill(0);

function fibo(n)
{
  if (n <= 2) 
    return 1;
  if (fiboData[n] === 0)
    fiboData[n] = fibo(n-1) + fibo(n-2);
  return fiboData[n];
}

2. Bottom-up

๋ฌธ์ œ ํ’€์ด๊ฐ€ ์•„๋ž˜์—์„œ ์œ„๋กœ ์ง„ํ–‰๋œ๋‹ค. ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , for๋ฌธ ๋‚ด์—์„œ ๋ฐ˜๋ณต๋œ๋‹ค.

let fiboData = new Array(100).fill(0);

function fibo(n)
{
  fiboData[0] = 0;
  fiboData[1] = 1;
  for (let i=2; i<=n; i++)
    fiboData[i] = fiboData[i - 1] + fiboData[i - 2];
  return fiboData[n];
}

 

๊ฒฐ๋ก 

๋™์  ๊ณ„ํš๋ฒ•์€ ๋ชจ๋“  ๋ฐฉ๋ฒ•์„ ์ผ์ผ์ด ๊ฒ€ํ† ํ•˜์—ฌ ์ตœ์ ์˜ ํ•ด๋ฅผ ์ฐพ์•„๋‚ด๋Š” ๋ฐฉ์‹์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

์—ฌ๊ธฐ์„œ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜(ํƒ์š• ์•Œ๊ณ ๋ฆฌ์ฆ˜)๊ณผ ๋Œ€๋น„๋œ๋‹ค. ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ชจ๋“  ํ•ด๋ฅผ ๊ตฌํ•˜์ง€ ์•Š๊ณ  ๊ทธ ์ˆœ๊ฐ„์—์„œ์˜ ์ตœ์ ์˜ ํ•ด๋ฅผ ์ฐพ๋Š” ๋ฐฉ์‹์ด๋‹ค. ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ฅ์น˜๋Š” ์ˆœ๊ฐ„๋งŒ์„ ๊ณ ๋ คํ•ด์„œ ํ•ด๋ฅผ ๊ตฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋„์ถœ๋œ ๊ฐ’์ด ํ•ญ์ƒ ์ตœ์ ์˜ ํ•ด๋ผ๊ณ  ํ•  ์ˆ˜ ์—†๋‹ค.

ํ•˜์ง€๋งŒ ๋™์  ๊ณ„ํš๋ฒ•์€ ๋ชจ๋“  ๋ฐฉ๋ฒ•์„ ๊ฒ€ํ† ํ•ด ๋ณด๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ ํšจ์œจ์ ์ธ ๊ฐ’์„ ํƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋น„ํ•ด ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ง€๋งŒ, ๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” ํ•ญ์ƒ ์ตœ์ ์˜ ํ•ด๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

728x90
๋ฐ˜์‘ํ˜•
LIST