๐Ÿ“ Coding Test Study/Algorithm

DP(Dynamic Programming) ๊ฐœ๋…, ํ’€์ด๋ฒ•

ibelieveinme 2024. 6. 7. 18:15
728x90

 

* DP(Dynamic Programming)๋ž€ ?

: ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„๊ณ  ์ž‘์€๋ฌธ์ œ๋กœ ํฐ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•. ์ž‘์€๋ฌธ์ œ๊ฐ€ ์ค‘๋ณต๋œ๋‹ค.

(vs ๋ถ„ํ• ์ •๋ณต: ๋ถ„ํ• ์ •๋ณต๊ณผ ๋น„์Šทํ•œ๋ฐ ๋ถ„ํ• ์ •๋ณต์€ ์ž‘์€๋ฌธ์ œ๊ฐ€ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š”๋‹ค.)

 

 

* DP ์˜ ํŠน์ง•

1) Overlapping Subproblem: ๋ถ€๋ถ„๋ฌธ์ œ(์ž‘์€๋ฌธ์ œ)๊ฐ€ ๊ฒน์นœ๋‹ค.

2) Optimal Substructure: ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ. ๋ฌธ์ œ์˜ ์ •๋‹ต์„ ์ž‘์€ ๋ฌธ์ œ์˜ ์ •๋‹ต์—์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ •๋‹ต์˜ ์ž‘์€ ๋ฌธ์ œ์˜ ์ •๋‹ต์€ ํ•ญ์ƒ ๊ฐ™๋‹ค.

 

 

* DP ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ‘œ์ ์ธ ์˜ˆ

: ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ !

0 1 1 2 3 5 8 13 21 34 55 89 ...

F0 = 0
F1 = 1
...
Fn = Fn-1 + Fn-2(n ≥ 2)

Fn ์ด๋ผ๋Š” ํฐ๋ฌธ์ œ ๊ฐ’์„ Fn-1 ๊ณผ Fn-2 ์˜ ์ž‘์€ ํ•ฉ์œผ๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ฆ‰, N๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋Š” N-1 ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์™€ N-2 ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.(Optimal Substructure)

 

N-1 ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋Š” ์–ด๋– ํ•  ๊นŒ?

N-2 ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์™€ N-3 ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์˜ ํ•ฉ์œผ๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ฆ‰, N๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•  ๋•Œ๋„ N-1 ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•  ๋•Œ๋„ N-2 ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ์ค‘๋ณต ์‚ฌ์šฉํ•œ๋‹ค.

์ž‘์€๋ฌธ์ œ๊ฐ€ ๊ฒน์นœ๋‹ค.(Overlapping Subproblem)

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

Top-down ๋ฐฉ์‹์ธ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ํ‘ผ DP.

n ๋ถ€ํ„ฐ 1๊นŒ์ง€ ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€๋ฌธ์ œ๋กœ ์ชผ๊ฐœ๋ฉฐ ํ’€์–ด๋‚˜๊ฐ„๋‹ค.

 

 

* DP ํŠน์ง•์— ๋”ฐ๋ฅธ ํ’€์ด ๋ฐฉ๋ฒ•

์ •๋‹ต์ด ๊ตฌํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์—, ์ •๋‹ต์„ ํ•œ ๋ฒˆ ๊ตฌํ•˜๋ฉด ๊ทธ ์ •๋‹ต์„ ์–ด๋”˜๊ฐ€์—(ex. ๋ฐฐ์—ด) ๋ฉ”๋ชจํ•ด๋†“๋Š”๋‹ค. (Memoization)

๋ฌธ์ œ ์‹œ ์‚ญ์ œ

F(5)๋ฅผ ์ฒ˜์Œ์—” ๋‹ค ์™ผ์ชฝ์ฒ˜๋Ÿผ ๊ตฌํ•˜์ง€๋งŒ, ๋‹ค์Œ์— F(3)์„ ๊ตฌํ•  ๋•Œ๋Š” ๋ฏธ๋ฆฌ ์ €์žฅํ•ด ๋†“์€ F(3) ๊ฐ’์„ ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (์˜ค๋ฅธ์ชฝ)

int memo[100];
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]; 
    } 
}
Top-down ๋ฐฉ์‹์— ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ ์šฉํ•œ ํ’€์ด๋ฒ•.

* ์‹œ๊ฐ„๋ณต์žก๋„: ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ๋”ฑ ํ•œ๋ฒˆ์€ ํ’€๊ธฐ ๋•Œ๋ฌธ์— O(N)

 

 

* DP๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

1. Top-down: ์žฌ๊ท€. ํฐ ๋ฌธ์ œ๋ฅผ ์ชผ๊ฐœ๋ฉด์„œ ์ž‘์€๋ฌธ์ œ๋กœ ๋‚ด๋ ค๊ฐ€๋Š” ๊ฒƒ.

2. Bottom-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];
}

Bottom-up ๋ฐฉ์‹์ธ for๋ฌธ์œผ๋กœ ํ‘ผ DP. Top-down ์€ ์œ„ ์ฝ”๋“œ ์ฐธ๊ณ .

0 ๋ถ€ํ„ฐ n ๊นŒ์ง€ ์ž‘์€ ๋ฌธ์ œ๋กœ ํฐ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋‚˜๊ฐ„๋‹ค.

 

๋‘˜๋‹ค ์ƒ๊ด€์—†๋Š”๋ฐ ์žฌ๊ท€๊ฐ€ ์ž์‹ ์žˆ์œผ๋ฉด Top-down, for๋ฌธ์ด ํŽธํ•˜๋ฉด Bottom-up ์œผ๋กœ ํ’€๊ธฐ.

Top-down๋งŒ์ด๋‚˜ Bottom-up์œผ๋กœ๋งŒ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋„ ์žˆ๊ธด ํ•œ๋ฐ, ๊ทธ๊ฑด ๋งค์šฐ ์–ด๋ ค์šด ๋ฌธ์ œ๋“ค์ด๋ผ ์ผ๋‹จ์€ DP ๋ฌธ์ œ์— ์ต์ˆ™ํ•ด์ง€๋Š”๋ฐ ์ง‘์ค‘ํ•˜๊ธฐ.

 

 

* ์ ํ™”์‹ ์„ธ์šฐ๋Š” ๋ฒ• !

: ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ–ˆ๋˜ ๊ฒƒ ์ฒ˜๋Ÿผ ์ ํ™”์‹์ด ๊ตฌํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.

: ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ž‘๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ธ๊ฐ€๋ฅผ ์ฐพ์ž.

 


 

* ์˜ˆ์‹œ๋ฌธํ•ญ

https://i-believe-in-me.tistory.com/414

 

[BOJ][C++] 1463๋ฒˆ 1๋กœ ๋งŒ๋“ค๊ธฐ(feat. DP)

[๋ฌธ์ œ]https://www.acmicpc.net/problem/1463์ •์ˆ˜ x ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, x ๋ฅผ 1๋กœ ๋งŒ๋“œ๋Š” ์ตœ์†Œ ์—ฐ์‚ฐ์˜ ์ˆ˜๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค. x ๋ฅผ 1๋กœ ๋งŒ๋“œ๋Š” ์—ฐ์‚ฐ์€ 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. 1) x ๊ฐ€ 3 ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋ฉด x ๋ฅผ 3 ์œผ๋กœ ๋‚˜๋ˆˆ

i-believe-in-me.tistory.com

 

728x90