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

๐Ÿ—ฃ๏ธ ์‹ ์ž… ์ธํ„ฐ๋ทฐ/์•Œ๊ณ ๋ฆฌ์ฆ˜

์‹ ์ž… ๊ฐœ๋ฐœ์ž ๊ธฐ์ˆ ๋ฉด์ ‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ๋™์ ๊ณ„ํš๋ฒ• DP

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

 

#include <iostream>
using namespace std;

long long d[100];

long long fibo(int x){
    if(x==1 || x==2){
        return 1;
    }
    
    if(d[x]!=0){
        return d[x];
    }
    
    d[x]=fibo(x-1)+fibo(x-2);
    return d[x];
}

int main(){
    cout << fibo(50) << '\n';
}

๋™์  ๊ณ„ํš๋ฒ•์ด๋ž€?

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

* ๊ทธ๋Ÿผ ๋ถ„ํ•  ์ •๋ณต์ด๋ž‘ ๋ญ๊ฐ€ ๋‹ค๋ฅธ๊ฑด๊ฐ€์š”?

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

 

* ๊ทธ๋Ÿผ ๋‹ค๋ฅธ dfs๋“ฑ ๊ณผ ๊ฐ™์€ ์žฌ๊ท€ํ•จ์ˆ˜ ์“ฐ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋ญ๊ฐ€ ๋‹ฌ๋ผ์š”?

  •  ์ผ๋ฐ˜ ์žฌ๊ท€๋กœ ํ’€๋ฉด ๋™์ผํ•œ ์ž‘์€ ๋ฌธ์ œ๋“ค์ด ์—ฌ๋Ÿฌ๋ฒˆ ๋ฐ˜๋ณต๋˜์–ด ๋น„ํšจ์œจ์ ์ธ ๊ณ„์‚ฐ์ด ๋œ๋‹ค. ์ฆ‰, ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ  ๋น„ํšจ์œจ์ ์ด๋ผ๋Š” ๊ฒƒ!!!
    •  n=10๋งŒ ์ผ๊ฒฝ์šฐ , n^2 ๋กœ ๋Œ ๊ฒฝ์šฐ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ์–ด์–ด์–ด์–ด์—„์ฒญ ๋‚˜๊ฒŒ ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค…
  • DP ๋Š” ๊ทธ์— ๋ฐ˜ํ•ด ๋‹ต์„ ์ €์žฅํ•˜๋Š” ์บ์‹œ๋ฐฐ์—ด์ธ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํ™œ์šฉํ•˜์—ฌ ์ค‘๋ณต ํšŸ์ˆ˜๋ฅผ ์ค„์—ฌ์ฃผ์–ด ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๊ฐ์†Œํ•œ๋‹ค. (๋น ๋ฆ„)
    • ์˜ˆ) dfs ๋กœ ์‹œ๊ฐ„ ์ œํ•œ ๊ฑธ๋ฆด ๊ฒฝ์šฐ ์‚ฌ์šฉ 

 

๋ฉ”๋ชจ์ด์ œ์ด์…˜ (Memoization)

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

 

 * ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด (fibonacci)

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

 

 ์ ํ™”์‹์€ ์ด๋ ‡๋‹ค. dy[i] = dy[i-2]+dy[i-1] 

dy[1]=1 // ๊ธฐ๋ณธ๊ฐ’ ์…‹ํŒ…
dy[2]=2 // ๊ธฐ๋ณธ๊ฐ’ ์…‹ํŒ…
dy[3]= dy[1]+dy[2]
dy[4]= dy[2]+dy[3]
…
dy[n]=n // ๋‹ต

 

๋‹ค์Œ ์ˆ˜์—ด๊ฐ’์€ ์ด์ „ ์ˆ˜์—ด ๊ณผ ๋‘ ๋‹จ๊ณ„ ์ „ ์ˆ˜์—ด์˜ ํ•ฉ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์ง€๊ณ , ๊ณ„์† ๊ฐ’์„ ์ €์žฅํ•˜์—ฌ ์ตœ์ข…ํ•ด๋ฅผ ๊ตฌํ•œ๋‹ค. 

function fib(n)
 if n = 0
  return 0
 else if n=1
  return 1
 else
  return fib(n-1) + fib(n-2)

์ฝ”๋“œ๋กœ ์งœ๋ณด์ž๋ฉด ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค

 

 

* ๊ทธ๋Ÿผ DP๋Š” ์–ธ์ œ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด๊ฐ€์š”?

  • ์ž‘์€ ๋ฌธ์ œ๋“ค์ด ๋ฐ˜๋ณต๋  ๊ฒฝ์šฐ (๊ทœ์น™ ๋ฐœ๊ฒฌ)
  • ๊ฐ™์€ ๋ฌธ์ œ๋“ค์„ ๊ตฌํ•  ๋•Œ ๋งˆ๋‹ค ์ •๋‹ต์ด ๊ฐ™์„ ๊ฒฝ์šฐ

 

* ๋™์  ๊ณ„ํš๋ฒ• ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ ๋‹จ๊ณ„ ๋ฐฉ๋ฒ•?

  1. ์ฃผ์–ด์ง„ ๋ฌธ์ œ๋ฅผ ์™„์ „ ํƒ์ƒ‰์„ ์ด์šฉํ•ด ํ•ด๊ฒฐํ•œ๋‹ค
  2. ์ค‘๋ณต๋œ ๋ถ€๋ถ„ ๋ฌธ์ œ๋ฅผ ํ•œ๋ฒˆ๋งŒ ๊ณ„์‚ฐํ•˜๋„๋ก ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ ์šฉํ•œ๋‹ค
  3. ์ตœ์ ํ•ด๋ฅผ ์ฐพ๋Š”๋‹ค

DP์˜ ์ข…๋ฅ˜

  • LIS (์ตœ๋Œ€๋ถ€๋ถ„์ฆ๊ฐ€์ˆ˜์—ด)
  • ๋ฐธ๋งŒ-ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋“ฑ๋“ฑ

์ถœ์ฒ˜ 

https://meongj-devlog.tistory.com/207?category=993385