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

๐Ÿ“• STUDY/Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜] DP ๋™์ ๊ณ„ํš๋ฒ•

โœ… ๋™์ ๊ณ„ํš๋ฒ•(DP)

 

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

- ํ•˜๋‚˜์˜ ํฐ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•

- ์ด๋ฏธ ๊ณ„์‚ฐ๋œ ์ž‘์€ ๋ฌธ์ œ์˜ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ €์žฅํ•ด๋‘๊ณ  ํ™œ์šฉํ•จ.

- ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰์‹œ๊ฐ„ ํšจ์œจ์„ฑ์„ ๋น„์•ฝ์ ์œผ๋กœ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ.

๋‹ต์„ ์žฌํ™œ์šฉํ•˜๋Š” ๊ฒƒ!
"์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด ๊ทธ ๋ฌธ์ œ๋ฅผ ๋” ์ž‘์€ ๋ฌธ์ œ์˜ ์—ฐ์žฅ์„ ์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ ,
๊ณผ๊ฑฐ์— ๊ตฌํ•œ ํ•ด๋ฅผ ํ™œ์šฉํ•˜๋Š”" ๋ฐฉ์‹์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

2. ๋™์ ๊ณ„ํš๋ฒ• ์‚ฌ์šฉ ์กฐ๊ฑด

1) ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Œ.

2) ์ž‘์€ ๋ฌธ์ œ์—์„œ ๊ตฌํ•œ ๊ฐ’์ด ๊ทธ๊ฒƒ์„ ํฌํ•จํ•˜๋Š” ํฐ ๋ฌธ์ œ์—์„œ๋„ ๋™์ผํ•œ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋จ (ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด)


โœ… ๋ถ„ํ• ์ •๋ณต๋ฒ• VS ๋™์ ๊ณ„ํš๋ฒ•

 

๊ณตํ†ต์ 

ํฐ ๋ฌธ์ œ๋ฅผ ์ชผ๊ฐœ์„œ ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„๋กœ ๋ถ„ํ• ํ•œ๋‹ค.

 

์ฐจ์ด์ 

- ๋ถ„ํ• ์ •๋ณต๋ฒ• : ๋ถ€๋ถ„ ๋ฌธ์ œ๋Š” ์„œ๋กœ ์ค‘๋ณต๋˜์ง€ ์•Š์Œ (๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ๋ฒ• ์‚ฌ์šฉ X)

- ๋™์ ๊ณ„ํš๋ฒ• : ๋ถ€๋ถ„ ๋ฌธ์ œ๋Š” ์ค‘๋ณต๋˜์–ด ์ƒ์œ„ ๋ฌธ์ œ ํ•ด๊ฒฐ์‹œ ์žฌํ™œ์šฉ๋จ (๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ๋ฒ• ์‚ฌ์šฉ O)

๐Ÿ’ก ์šฉ์–ด์ •๋ฆฌ ๐Ÿ’ก 
๋ฉ”๋ชจ์ด์ œ์ด์…˜(memoization)
์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ์ด ๋™์ผํ•œ ๊ณ„์‚ฐ์„ ๋ฐ˜๋ณตํ•ด์•ผ ํ•  ๋•Œ,
์ด์ „์— ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•จ์œผ๋กœ์จ ๋™์ผํ•œ ๊ณ„์‚ฐ์˜ ๋ฐ˜๋ณต ์ˆ˜ํ–‰์„ ์ œ๊ฑฐํ•˜์—ฌ
ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์†๋„๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. 

โœ… ๋™์ ๊ณ„ํš๋ฒ• ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

 

1. ์™„์ „ํƒ์ƒ‰๋ฒ•์œผ๋กœ ์ ‘๊ทผํ•œ๋‹ค.

2. ๋ฐ˜๋ณต๋˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ๋ฅผ ์ฐพ๋Š”๋‹ค.

3. ๊ธฐ์ €๋‹จ๊ณ„๋ฅผ ์„ค์ •ํ•œ๋‹ค.

4. ์ ํ™”์‹์„ ์„ค์ •ํ•œ๋‹ค.

5. ์ค‘๋ณต๋œ ๋ฌธ์ œ๋ฅผ ํ•œ๋ฒˆ๋งŒ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ด์šฉํ•œ๋‹ค.

๐Ÿ’ก ์šฉ์–ด์ •๋ฆฌ ๐Ÿ’ก 
๊ธฐ์ €๋‹จ๊ณ„ : ์ ํ™”์‹์œผ๋กœ ๋” ์ด์ƒ ๊ณ„์‚ฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ถ€๋ถ„

โœ… ๋™์ ๊ณ„ํš๋ฒ• ์‚ฌ์šฉ ์˜ˆ์‹œ (ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด)

 

1. ์žฌ๊ท€๋กœ ํ•ด๊ฒฐํ•œ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด

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

๐Ÿ’ฅ ๋ฐ˜๋ณต๋˜๋Š” ๊ณ„์‚ฐ์ด ๋งŽ์Œ

2. ๋™์ ๊ณ„ํš๋ฒ• (Top-down ๋ฐฉ์‹) ์‚ฌ์šฉ

int memo[100]{}; //๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ณต๊ฐ„. ์ „์—ญ ๋ณ€์ˆ˜์ด๋ฏ€๋กœ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
int fibonacci(unsigned int n)
{
  if (n<=1) //0๋ฒˆ์งธ, 1๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜
    return n;
  if (memo[n]!=0) //๋ฉ”๋ชจ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ(0์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์—ˆ์œผ๋ฏ€๋กœ 0์ด ์•„๋‹ˆ๋ผ๋ฉด ๋ฉ”๋ชจ๊ฐ€ ์“ฐ์ธ ๊ฒƒ์ž„)
    return memo[n]; //๋ฉ”๋ชจ ๋ฆฌํ„ด
  memo[n] = fibonacci(n-1) + fibonacci(n-2); //์ž‘์€ ๋ฌธ์ œ๋กœ ๋ถ„ํ• 
  return memo[n];
}

 

3. ๋™์ ๊ณ„ํš๋ฒ• (Bottom-up ๋ฐฉ์‹) ์‚ฌ์šฉ

int dp[50] = { 1,1 };

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

 

๐Ÿ’ฅ ์‹œ๊ฐ„ ๋ณต์žก๋„ ์ฐจ์ด

(์™ผ) ์ผ๋ฐ˜ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด / (์˜ค) DP ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด

1) ์ผ๋ฐ˜ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด

- ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋†’์ด๊ฐ€ n์ธ ํŠธ๋ฆฌ๊ฐ€ 2๊ฐœ ์กด์žฌํ•จ

- ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(2^n)

 

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

- ๋‘๋ฒˆ์”ฉ ๋ฐ˜๋ณตํ•  ํ•„์š”๊ฐ€ ์—†์Œ

- ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(n)