๐Ÿ’ป

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ - Dynamic Programming ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜/๊ธฐ๋ณธ๊ธฐ ๋‹ค์ง€๊ธฐ

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ - Dynamic Programming

๋˜ํšจ๋‹ˆ 2020. 3. 16. 17:28

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Dynamic Programming)

    => ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์„œ ํ‘ธ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

  • ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ฐ ๋ฌธ์ œ๋Š” ํ•œ ๋ฒˆ๋งŒ ํ’€์–ด์•ผ ํ•œ๋‹ค. 
  • Optimal Substructure ๋ฅผ ๋งŒ์กฑํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ™์€ ๋ฌธ์ œ๋Š” ๊ตฌํ•  ๋•Œ๋งˆ๋‹ค ์ •๋‹ต์ด ๊ฐ™๋‹ค.   
  • ๋”ฐ๋ผ์„œ, ์ •๋‹ต์„ ํ•œ ๋ฒˆ ๊ตฌํ–ˆ์œผ๋ฉด ์–ด๋”˜๊ฐ€์— ๋ฉ”๋ชจํ•ด๋†“๋Š”๋‹ค.
  • ์ด๋Ÿฐ ๋ฉ”๋ชจํ•˜๋Š” ๊ฒƒ์„ ์ฝ”๋“œ์˜ ๊ตฌํ˜„์—์„œ๋Š” ๋ฐฐ์—ด์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค. 
  • ๋ฉ”๋ชจ๋ฅผ ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์˜์–ด๋กœ Memoization ์ด๋ผ๊ณ  ํ•œ๋‹ค. 

 

 

 

๋‘ ๊ฐ€์ง€ ์†์„ฑ์„ ๋งŒ์กฑํ•ด์•ผ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

 

1. Overlapping Subproblem

     (๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ ์„œ ํ‘ธ๋Š”๋ฐ, ์ด๋•Œ ๋ฌธ์ œ๋“ค๋ผ๋ฆฌ ๊ฒน์ณ์•ผํ•œ๋‹ค.)

  • ํฐ ๋ฌธ์ œ์™€ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ์ชผ๊ฐค ์ˆ˜ ์žˆ๋‹ค. 

์˜ˆ์‹œ)  ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜

F0 = 1, F1= 1, Fn = Fn-1 + Fn-2 (n>=2)

๋ฌธ์ œ: N๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ

์ž‘์€๋ฌธ์ œ: N-1๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ, N-2๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ

 

๋ฌธ์ œ: N-1๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ

์ž‘์€๋ฌธ์ œ: N-2๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ, N-3๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ

 

=> Overlapping Subproblem ์„ ๋งŒ์กฑํ•œ๋‹ค๋ฉด, ๋ฌธ์ œ์˜ ์ •๋‹ต์„ ์ž‘์€ ๋ฌธ์ œ์˜ ์ •๋‹ต์„ ํ•ฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

2. Optimal Substructure

  • ๋ฌธ์ œ์˜ ์ •๋‹ต์„ ์ž‘์€ ๋ฌธ์ œ์˜ ์ •๋‹ต์—์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์‹œ)

 

10 ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ฉด์„œ ๊ตฌํ•œ 4๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜

9 ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ฉด์„œ ๊ตฌํ•œ 4๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜

...

5๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ฉด์„œ ๊ตฌํ•œ 4๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜

4๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ฉด์„œ ๊ตฌํ•œ 4๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜

 

4๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋Š” ํ•ญ์ƒ ๊ฐ™๋‹ค. 

 

=> Overlapping Subproblem ์„ ๋งŒ์กฑํ•œ๋‹ค๋ฉด, ๋ฌธ์ œ์˜ ํฌ๊ธฐ์— ์ƒ๊ด€์—†์ด ์–ด๋–ค ํ•œ ๋ฌธ์ œ์˜ ์ •๋‹ต์€ ํ•ญ์ƒ ์ผ์ •ํ•˜๋‹ค. 

 

 

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์˜ ๊ตฌํ˜„

int fibonacci(int n){
    if(n<=1){
        return n;
    } else{
        return fibonacci(n-1)+fibonacci(n-2);
    }
}

์œ„์˜ ๋ฐฉ์‹์€ ๊ฒน์น˜๋Š” ํ˜ธ์ถœ์ด ์ƒ๊ธด๋‹ค. 

int memo[100]; //n๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด
int fibonacci(int n){
      if(n<=1){
            return n;
      } else {
      		if(memo[n] > 0){ //์ด์ „์— ๊ตฌํ•œ ๊ฐ’์ด๋ฉด 
            		return memo[n];
            }
            memo[n] = fibonacci(n-1) + fibonacci(n-2);
            return memo[n];
      }
}
    

 

 

 

 

 

๋‹ค์ด๋‚˜๋ฏน ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” 2๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ๋‹ค. 

 

1. Top-down

  • ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆˆ๋‹ค.
  • ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ‘ผ๋‹ค. 
  • ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ์œผ๋‹ˆ, ์ด์ œ ๋ฌธ์ œ๋ฅผ ํ‘ผ๋‹ค. 
  • ์‹œ๊ฐ„๋ณต์žก๋„ = ์ฑ„์›Œ์•ผ ํ•˜๋Š” ์นธ์˜ ์ˆ˜ X 1์นธ์„ ์ฑ„์šธ ๋•Œ์˜ ๋ณต์žก๋„ (ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„ = n X O(1) = O(n) )

    => ๋ณดํ†ต ์žฌ๊ท€ ํ˜ธ์ถœ์„ ์ด์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ‘ผ๋‹ค. (์˜ˆ: ์œ„์˜ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ ๊ตฌํ˜„ ๋ฐฉ์‹)

int d[100]; //n๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด
int fibonacci(int n){
      if(n<=1){
            return n;
      } else {
      		if(d[n] > 0){ //์ด์ „์— ๊ตฌํ•œ ๊ฐ’์ด๋ฉด 
            		return d[n];
            }
            d[n] = fibonacci(n-1) + fibonacci(n-2);
            return d[n];
      }
}

 

 

2. Bottm-up

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

    => ๋ณดํ†ต for๋ฌธ์„ ์ด์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ‘ผ๋‹ค. 

int d[100];
int fibonacci(int n){
      d[0] = 0;
      d[1] = 1;
      for(int i=2; i<=n; i++)	{
            d[i] = d[i-1] + d[i-2];
      }
      return d[n];
}

 

 

 

 

 

๋ฌธ์ œ ํ’€์ด ์ „๋žต

  • ๋ฌธ์ œ์—์„œ ๊ตฌํ•˜๋ ค๊ณ  ํ•˜๋Š” ๋‹ต์„ ๋ฌธ์žฅ์œผ๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค. 
  • ๋ฌธ์ œ๋ฅผ ๋งŽ์ด ํ’€์–ด๋ณด๋ฉด์„œ ๊ฐ์„ ์žก๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. 

 

๋ฐ˜์‘ํ˜•
Comments