๐Ÿ“ Coding Test Study

DP(Dynamic Programming)?

ibelieveinme 2021. 4. 27. 00:21
728x90

โ–ถ DP(Dynamic Programming)?

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

: ๋ถ„ํ• ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋น„์Šท. ๋ถ„ํ• ์ •๋ณต์€ ์ž‘์€ ๋ฌธ์ œ๊ฐ€ ํ•œ ๋ฒˆ์”ฉ ๋‚˜์˜ค์ง€๋งŒ, DP๋Š” ์ž‘์€ ๋ฌธ์ œ๊ฐ€ ์—ฌ๋Ÿฌ๋ฒˆ ๋ฐ˜๋ณต๋˜์–ด ๋‚˜์˜จ๋‹ค๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

 

[DP์˜ ํŠน์ง• 2๊ฐ€์ง€]

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

2) Optimal Substructure: ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค.

 

* Overlapping Subproblem?

Overlapping Subproblem์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋“ค์–ด๋ณด์ž.

 

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

F0 = 0

F1 = 1

Fn = Fn-1 + Fn-2(n>=2)        => 0, 1, 1, 2, 3, 5, 8, 13, ...

 

์œ„์˜ ์กฐ๊ฑด์„ ์ดํ•ดํ–ˆ๋‹ค๋ฉด ์•„๋ž˜ ๋ฌธ์ œ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.

 

Q. N๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ผ.

์ด ๋ฌธ์ œ๋Š” ์ž‘์€ ๋ฌธ์ œ 2๊ฐœ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

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

 

Q. N-1๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ผ.

์ด ๋ฌธ์ œ ์—ญ์‹œ, ์ž‘์€ ๋ฌธ์ œ 2๊ฐœ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š”๋ฐ,

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

 

Q. N-2๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ผ.

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

 

์œ„ ๋ฌธ์ œ๋“ค์„ ๋ณด๋ฉด ์ž‘์€๋ฌธ์ œ๋“ค์ธ N-2๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์™€ N-3๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐ˜๋ณต๋œ๋‹ค.

 

์ด๋ ‡๊ฒŒ Overlapping Subproblem๋Š” ํฐ ๋ฌธ์ œ์™€ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๊ณ 

๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ์ชผ๊ฐค ์ˆ˜ ์žˆ๋‹ค๋Š” ํŠน์ง•์„ ๊ฐ–๋Š”๋‹ค. == ๋ฌธ์ œ๊ฐ€ ๊ฒน์นœ๋‹ค.

 

 

* Optimal Substructure?

: ๋ฌธ์ œ์˜ ์ •๋‹ต์„ ์ž‘์€ ๋ฌธ์ œ์˜ ์ •๋‹ต์—์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ

 

Optimal Substructure์˜ ์˜ˆ์‹œ)

์„œ์šธ์—์„œ ๋ถ€์‚ฐ์„ ๊ฐ€์žฅ ๋น ๋ฅธ ๊ธธ์ด ๋Œ€์ „๊ณผ ๋Œ€๊ตฌ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค๋ฉด(์„œ์šธ->๋Œ€์ „->๋Œ€๊ตฌ->๋ถ€์‚ฐ)

๋Œ€์ „์—์„œ ๋ถ€์‚ฐ์„ ๊ฐ€๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ๊ธธ์€ ๋Œ€๊ตฌ๋ฅผ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค.(๋Œ€์ „->๋Œ€๊ตฌ->๋ถ€์‚ฐ)

 

์œ„์—์„œ ๋ณธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด๋„ ์ž‘์€ ๋ฌธ์ œ์˜ ์ •๋‹ต์„ ํ•ฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.(Fn = Fn-1 + Fn-2)

 

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

 

์˜ˆ๋ฅผ ๋“ค์–ด, 

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

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

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

...

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

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


โ–ถ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฌธ์ œ๋ฅผ ์ •๋ฆฌํ•ด๋ณด์ž๋ฉด,

 

1) ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ฐ ๋ฌธ์ œ๋Š” ํ•œ ๋ฒˆ๋งŒ ํ’€์–ด์•ผ ํ•œ๋‹ค.

2) Optimal Substructure๋ฅผ ๋งŒ์กฑํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ™์€ ๋ฌธ์ œ๋Š” ๊ตฌํ•  ๋•Œ๋งˆ๋‹ค ์ •๋‹ต์ด ๊ฐ™๋‹ค.

3) ๋”ฐ๋ผ์„œ ์ •๋‹ต์„ ํ•œ ๋ฒˆ ๊ตฌํ–ˆ์œผ๋ฉด, ์ •๋‹ต์„ ์–ด๋”˜๊ฐ€์— ๋ฉ”๋ชจํ•ด๋†“๋Š”๋‹ค.

4) ์ด๋Ÿฐ ๋ฉ”๋ชจํ•˜๋Š” ๊ฒƒ์„ ์ฝ”๋“œ์˜ ๊ตฌํ˜„์—์„œ๋Š” ๋ฐฐ์—ด์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค.

5) ๋ฉ”๋ชจ๋ฅผ ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์˜์–ด๋กœ Memorization์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

์œ„์—์„œ ์„ค๋ช…ํ•œ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๋‹ค์ด๋‚˜๋ฏน ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ’€์–ด๋ณด์ž.

 

๊ทธ๋ƒฅ ์žฌ๊ท€๋กœ ํ’€์—ˆ์„ ๋•Œ,

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

๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ฏ€๋กœ, f(3), f(2), f(1), f(0)์˜ ๊ฒฝ์šฐ๊ฐ€ ๊ฒน์นœ๋‹ค.

memorization์„ ์ด์šฉํ•œ DP๋กœ ํ’€์—ˆ์„ ๋•Œ,

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];
    }
}

๊ฒน์น˜๋Š” ๊ฒฝ์šฐ๋ฅผ memo[100] ๋ฐฐ์—ด์— ์ €์žฅํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ๋”์ด์ƒ ํƒ์ƒ‰ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ฆผ์—์„œ ๋ณด์—ฌ์ง€๋“ฏ์ด ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋งค์šฐ ์ค„์–ด๋“ค ๊ฒƒ์ด๋‹ค.

์—ฌ๋Ÿฌ๋ฒˆ ํ’€ ๋•Œ๋Š” ์ €์žฅ๋œ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

๊ฐ๊ฐ์ด O(1)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ ์ „์ฒด๋Š” O(n)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค.


โ–ถ ๋‹ค์ด๋‚˜๋ฏน์„ ํ‘ธ๋Š” 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•

1) Top-down: ์žฌ๊ท€ํ•จ์ˆ˜ ์ด์šฉ

: ํฐ ๋ฌธ์ œ๋ฅผ ์ ์  ์ชผ๊ฐœ๋ฉด์„œ ์ž‘์€๋ฌธ์ œ๋กœ ํ‘ธ๋Š” ๊ฒƒ

2) Bottom-up: for๋ฌธ ์ด์šฉ

: ์ž‘์€๋ฌธ์ œ๊ฐ€ ์ ์  ํ•ฉ์ณ์ง€๋ฉด์„œ ์›๋ž˜ ๋ฌธ์ œ๋ฅผ ํ’€๊ฒŒ ํ•˜๋Š” ๊ฒƒ

 

Top-down์€ ์œ„์—์„œ ๋ดค์œผ๋‹ˆ Bottom-up ๋ฐฉ๋ฒ•์„ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ž.

 

* Bottom-up

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

2) ๋ฌธ์ œ์˜ ํฌ๊ธฐ๋ฅผ ์กฐ๊ธˆ์”ฉ ํฌ๊ฒŒ ๋งŒ๋“ค๋ฉด์„œ ๋ฌธ์ œ๋ฅผ ์ ์  ํ‘ผ๋‹ค.

3) ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ์™”๊ธฐ ๋•Œ๋ฌธ์—, ํฐ ๋ฌธ์ œ๋Š” ํ•ญ์ƒ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

4) ๊ทธ๋Ÿฌ๋‹ค๋ณด๋ฉด ์–ธ์  ๊ฐ€ ํ’€์–ด์•ผํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

 

์œ„์—์„œ Top-down(์žฌ๊ท€)์œผ๋กœ ํ‘ผ ๊ฑธ 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];
 }

โ–ถ DP ๋ฌธ์ œํ’€์ด์ „๋žต

: ์ ํ™”์‹ ์„ธ์šฐ๋Š” ๊ฒƒ์ด ๊ด€๊ฑด์ด๋‹ค.

 

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์—์„œ ๋ดค๋“œ์‹œ DP๋ฌธ์ œ๋Š” Fn = Fn-1 + Fn-2 ๊ฐ™์€ ์ ํ™”์‹์„ ์„ธ์šธ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๊ทธ๋Ÿผ ์ ํ™”์‹์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?

 

๋จผ์ €, ์ ํ™”์‹์˜ ์ •์˜๋ฅผ ์„ธ์›Œ์•ผ ํ•œ๋‹ค.

 

1. ์ ํ™”์‹์˜ ์ •์˜๋ฅผ ๊ธ€๋กœ ์ ์–ด๋ณด๊ณ , ์‹์œผ๋กœ ๋Œ€์ถฉ ํ‘œํ˜„ํ•ด๋ณธ๋‹ค.

: ์ ํ™”์‹์„ ํ†ตํ•ด N๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.

: D[N] = 

 

2. ๋ฌธ์ œ๋ฅผ ์ž‘์€๋ฌธ์ œ๋กœ ๋‚˜๋ˆ ์•ผ ํ•œ๋‹ค.

์ž‘์€๋ฌธ์ œ๋„ ์–ด๋–ป๊ฒŒ ๋ฌธ์ œ๋ฅผ ์ž‘๊ฒŒ ๋งŒ๋“ค์ง€ ๊ธ€๋กœ ์ ์–ด๋ณด๊ณ  ์‹์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

: N๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋Š” N-1๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ + N-2๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์ด๋‹ค.

: D[N] = D[N-1] + D[N-2] ์™„์„ฑ

 

์ž˜ ์•ˆ์™€๋‹ฟ์œผ๋ฏ€๋กœ ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ์ตํ˜€๋ณด์ž...

 

 

์ถœ์ฒ˜: BOJ ์˜จ๋ผ์ธ ๊ฐ•์˜(์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ์ดˆ)

728x90