๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
the others/Algorithm

Dynamic Programming ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ

by ciocio 2021. 10. 11.

๐Ÿ“Œ  ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€ ?

 

๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ๊ณ  ํ•ด์„œ ๋™์ ์œผ๋กœ ?!? ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์ด๋ฃจ์–ด์ง€๋Š” ๊ฑด ์•„๋‹ˆ๋‹ค ใ…‹ใ…‹ใ…‹

ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด ํ‘ธ๋Š” ๋ฒ•์„ ๋งํ•œ๋‹ค.  ->  ๊ทธ๋Ÿผ ๋ถ„ํ•  ์ •๋ณต ์•„๋‹Œ๊ฐ€ ?

 

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

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

 

์ฆ‰, ๋ถ„ํ•  ์ •๋ณต์€ ์ง„์งœ ํฐ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ์ž‘๊ฒŒ ์ž‘๊ฒŒ ๋‚˜๋ˆ ์„œ ํ‘ธ๋Š” ๋ฐฉ์‹์ด๋ผ๋ฉด,

๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์–ด์งœํ”ผ ๋ฐ˜๋ณต๋˜๋Š” ์ž‘์€ ๋ฌธ์ œ๋“ค์„ ํ•œ ๊ณณ์— ๋ฌถ์–ด ๋†“๊ฑฐ๋‚˜(?) ๊ธฐ๋ก(?) ํ•˜๋Š” ์‹์œผ๋กœ 

๋ถˆํ•„์š”ํ•œ ๋ฐ˜๋ณต๋“ค์„ ์ค„์ด๋ฉด์„œ ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค.

 

๐Ÿ“  Memoization ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด๋ž€ ?

๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋ฐ˜๋ณต๋˜๋Š” ์ž‘์€ ๋ฌธ์ œ๋“ค์„ " ๊ธฐ๋ก " ์„ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ๋ฐ˜๋ณต์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
ํ•œ ๋ฒˆ ๊ณ„์‚ฐํ•œ ์ž‘์€ ๋ฌธ์ œ์˜ ๊ฐ’์€ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ํ•œ ๊ณณ์— ์ €์žฅ(๊ธฐ๋ก) ํ•ด๋†“๋Š”๋‹ค.

 

// memoization ์˜ˆ์‹œ

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

// f(2) = f(1) + f(0)
// f(3) = f(2) + f(1) = f(1) + f(0) + f(1)
// f(4) = f(3) + f(2) = f(2) + f(1) + f(1) + f(0) = f(1) + f(0) + f(1) + f(1) + f(0)

// -> ์ž‘์€ ๋ฌธ์ œ๋“ค์ด ๋ฐ˜๋ณต๋œ๋‹ค.
// -> ๊ฐ™์€ ๋ฌธ์ œ๋Š” ๊ตฌํ•  ๋•Œ๋งˆ๋‹ค ์ •๋‹ต์ด ๊ฐ™๋‹ค.

// ๋ฐ˜๋ณต๋˜๋Š” ๊ฐ’๋“ค์„ ๋ฐฐ์—ด์— ์ €์žฅํ•ด๋‘๊ณ  ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๊บผ๋‚ด ์“ด๋‹ค. ^__^

 

 

๐Ÿ“Œ  ๊ตฌํ˜„ ๋ฐฉ๋ฒ• : Bottom-up & Top-down

 

โ—พ  Bottom-up

 

// Bottom-up 
// ์•„๋ž˜๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ, ๊ฐ’์„ ๊ตฌํ•ด ๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์ด๋‹ค. ์•„๋ž˜ -> ์œ„

// ๋Œ€๋ถ€๋ถ„์˜ ๋ฐ˜๋ณต๋ฌธ์ด Bottom-up ๋ฐฉ์‹์— ํ•ด๋‹น๋œ๋‹ค.

function fibo_bottom_up(n){
  if(n <= 1) return n;
  
  let front = 0;
  let next  = 1;
  
  for(let i=1; i<n; i++){
  	
    let sum = front + next;
    front = next;
    next = sum;
    
  }
  
  return sum;
}

// fibo_bottom_up(6)์„ ๊ตฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ,

// i=1, sum=1, front=1, next=1
// i=2, sum=2, front=1, next=2
// i=3, sum=3, front=2, next=3
// i=4, sum=5, front=3, next=5
// i=5, sum=8, front=5, next=8     return๋˜๋Š” ๊ฐ’์€ 8์ด๋‹ค.

// ์•„๋ž˜๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ฐจ๊ทผ์ฐจ๊ทผ ์˜ฌ๋ผ์˜ค๋Š” ๊ณผ์ •์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

โ—พ  Top-down

 

// Top-down
// ํฐ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ’€์–ด์•ผ ๊ฐ’์ด ๋‚˜์˜จ๋‹ค๋Š” ๊ฑธ ์•Œ์•„์•ผ ใ…‹ใ…‹ ๊ทธ์ œ์„œ์•ผ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
// ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐฉ์‹ ์ ˆ๋Œ€ ์•„๋‹˜ X ํ•„์š”ํ•œ ์ž‘์€ ๋ฌธ์ œ๋“ค๋งŒ ํ•ด๊ฒฐํ•˜๊ณ  ๋‹ต์„ ๋„์ถœ ! ์œ„ -> ์•„๋ž˜

// ๋Œ€๋ถ€๋ถ„์˜ ์žฌ๊ท€ ํ•จ์ˆ˜๊ฐ€ Top-down ๋ฐฉ์‹์— ํ•ด๋‹น๋œ๋‹ค
// fibo_top_down(6)์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด fibo_top_down(5)์™€ fibo_top_down(4)๋ฅผ ๊ตฌํ•˜๊ธฐ ์‹œ์ž‘ํ•จ

function fibo_top_down_recur(n){
  if(n <= 1) return n;
  return fibo_top_down_recur(n-1) + fibo_top_down_recur(n-2);
}


// ์šฐ๋ฆฌ๋Š” Dynamic Programming ์„ ๋ฐฐ์šฐ๊ณ  ์žˆ์œผ๋‹ˆ,
// ์ด๋ฏธ ๊ตฌํ•œ ๊ฐ’์„ ๋˜ ๊ตฌํ•˜๋Š” ๋‚ญ๋น„๋Š” ํ•˜์ง€ ์•Š๋„๋ก ์ฝ”๋“œ๋ฅผ ์งœ์ž !~ :)

function fibo_top_down_dp(n){
  let memo = [0, 1];
  
  if(n <= 1) return memo[n];
  
  for(let i=2; i<n; i++){
  	memo[n] = memo[n-1] + memo[n-2]
  }
  
  return memo[n];
}

 

 

๐Ÿ“Œ  ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ™œ์šฉํ•œ ๋ฌธ์ œ ํ’€์ด ์˜ˆ์‹œ

 

2021.10.12 - [๊ฐœ๋ฐœ ๊ณต๋ถ€/Algorithm] - ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๊ฑฐ์Šค๋ฆ„๋ˆ ๋ฌธ์ œ ํ’€์ด

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๊ฑฐ์Šค๋ฆ„๋ˆ ๋ฌธ์ œ ํ’€์ด

๐Ÿ“Œ ๋ฌธ์ œ โ—พ ํ•ด์„ค Finn์€ ํŽธ์˜์ ์—์„œ ์•ผ๊ฐ„ ์•„๋ฅด๋ฐ”์ดํŠธ๋ฅผ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•ผ๊ฐ„์— ์†๋‹˜์ด ๋„ˆ๋ฌด ์—†์–ด ์‹ฌ์‹ฌํ•œ Finn์€ ์†๋‹˜๋“ค๊ป˜ ๊ฑฐ์Šค๋ฆ„๋ˆ์„ n ์›์„ ์ค„ ๋•Œ ๋ฐฉ๋ฒ•์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ๋กœ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ

code-designer.tistory.com

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€