Dynamic Programming

chamingยท2021๋…„ 1์›” 5์ผ
0

Dynamic Programing๋ž€?

๐Ÿ’ก๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด ์ ํ™”์‹์„ ๊ตฌํ•˜์—ฌ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์ด์ „์— ์‚ฌ์šฉ๋œ ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ์‰ฝ๋‹ค.

ํ”ผ๋ณด๋‚˜์น˜์ˆ˜์—ด์ด ๊ฐ€์žฅ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์ด๋ž€ 1,1,2,3,5,8,13,...... ์™€ ๊ฐ™์ด ์ด์ „์˜ ๋‘ ํ•ญ์„ ๋”ํ•˜์—ฌ ๋งŒ๋“œ๋Š” ์ˆ˜์—ด์ด๋‹ค.
๋”ฐ๋ผ์„œ f(n) = f(n-1) + f(n-2) ๊ณ„์‚ฐ์‹์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

// ์žฌ๊ท€ํ•จ์ˆ˜ ์ด์šฉ(recursive)
public static int fibo(int n){
	if(n == 1 || n ==0 ){
    	return 1;
    }
    return fibo(n-1)+fibo(n-2);
}

์œ„์™€ ๊ฐ™์€ ์‹์€ ๊ฐ„๋‹จํ•œ ๊ณ„์‚ฐ์€ ๋ฌธ์ œ ์—†๊ฒ ์ง€๋งŒ,
๐Ÿคฆโ€โ™€๏ธfibo(10) ํ•จ์ˆ˜๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋ฉด์„œ, ์ˆซ์ž๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ Stack OverFlow๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ Dynamic Programing ๊ธฐ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
๐Ÿ™†โ€โ™€๏ธ fibo()ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์„ ์ตœ์†Œํ™”์‹œ์ผœ, ์ด๋ฏธ ๊ณ„์‚ฐ๋œ ์ ์ด ์žˆ๋‹ค๋ฉด ๊ฐ’์„ ๋ถˆ๋Ÿฌ์™€์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด๋ณด์ž.(์ดํ•ด๋ฅผ ๋•๊ธฐ์œ„ํ•ด ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ง‰์“ด ์ฝ”๋“œ์ด๋‹ค..)

// DP๋ฅผ ์ด์šฉํ•œ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด
public static int[] fibo = new int[10];			// dp๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด int[] ๋ฐฐ์—ด์„ ์„ ์–ธ

public static int fibo(int n){
    fibo[0] = 1;
    fibo[1] = 1;
    for(int i=2; i<=n; i++){
    	// ์‹์„ ์ด์šฉํ•˜์—ฌ, ์ด์ „์— ์‚ฌ์šฉํ–ˆ๋˜ ๊ณ„์‚ฐ์‹์„ ์žฌํ™œ์šฉํ•œ๋‹ค.
        // ์ด๊ฒƒ์„ memoization์ด๋ผ๊ณ  ํ• ์ˆ˜ ์žˆ๋‹ค.
    	fibo[i] = fibo[i-1] + fibo[i-2];
    }
    return fibo[n];
}

๐Ÿ‘€๊ทธ๋ ‡๋‹ค๋ฉด, Dynamic Programing์ด ๋ฌด์กฐ๊ฑด ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•๋ณด๋‹ค ๋” ์ข‹์„๊นŒ?

1. ์‹œ๊ฐ„๋ณต์žก๋„ : DP O(n^2) < recursive O(2^n)
์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์‚ดํŽด๋ณธ๋‹ค๋ฉด DP๊ฐ€ ํ›จ์”ฌ ๋น ๋ฅด๋‹ค.

2. ๊ณต๊ฐ„๋ณต์žก๋„ : DP > recursive
DP์˜ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•œ๋‹ค.
memoization๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๊ณ„์‚ฐ์ด ๋œ๊ฐ’์„ ์ €์žฅํ•ด ๋†“๊ณ  ์žˆ๋‹ค๊ฐ€, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ค‘๋ณต๊ณ„์‚ฐ ์—†์ด ํ˜ธ์ถœํ•œ๋‹ค. ์œ„์˜ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋งŒ ์‚ดํŽด๋ณด์•„๋„ int[]์™€ ๊ฐ™์ด ์–ด๋”˜๊ฐ€์—๋Š” ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ์žˆ์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


๊ทธ๋ ‡๋‹ค๋ฉด ์ด์ œ ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ DP์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

DP ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ข…๋ฅ˜

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

ํ•˜๋‚˜์˜ ์ •์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ์œผ๋กœ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ(Floyd Warshall) ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ชจ๋“  ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
๋ชจ๋“  ์ •์ ์—์„œ ๋ชจ๋“  ์ •์ ์œผ๋กœ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒฝ์šฐ

์ข€ ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ โ–ถโ–ถโ–ถ Floyd Warshall ์•Œ๊ณ ๋ฆฌ์ฆ˜

DP ์ ‘๊ทผ๋ฐฉ์‹

๊ณ„์† ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด๋กœ ์„ค๋ช…์„ ํ•ด๋ณธ๋‹ค.

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

DP = ๋ฉ”๋ชจ์ด์ œ์ด์…˜์€ ์•„๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ, ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ๊ฐœ๋…์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šธ๊ฑฐ ๊ฐ™์•„์„œ ํ•จ๊ป˜ ์„ค๋ช…ํ•œ๋‹ค.

๊ณ„์‚ฐ๋œ ๊ฐ’์„ ๋ฒ„๋ฆฌ์ง€์•Š๊ณ  ์ €์žฅํ•œ๋‹ค๋Š” ๋œป.
๊ณ„์‚ฐ๋œ ๊ฐ’์„ ์ €์žฅํ•ด๋‘๊ณ  ์žˆ๋‹ค๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด๋‹ค.
์ด๋ ‡๊ฒŒ ์ €์žฅ๋˜๋Š” ๋ฐฐ์—ด์„ '์บ์‹œ'๋ผ๊ณ  ํ•˜๋ฉฐ, ์ค‘๊ฐ„์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ '์บ์‹ฑํ•œ๋‹ค'๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.

TopDown

์žฌ๊ท€ํ•จ์ˆ˜์ด๋‹ค.

fibo(10)์„ ๊ตฌํ•œ๋‹ค๋ฉด, fibo(9), ffibo(8) ํฐ ์ˆ˜์—์„œ ์ž‘์€ ์ˆ˜์˜ ๋ฐฉํ–ฅ์œผ๋กœ ๊ณ„์† ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋งํ•œ๋‹ค.

public int[10] fibo = {0,};		// ๋ฐฐ์—ด์„ 0์œผ๋กœ ๋ชจ๋‘ ์ดˆ๊ธฐํ™”

public class int fibonachi(int n){
	if(n <2){		// fibo[0] , fibo[1] = 1;
    	return 1;
    }
    
    if( fibo[n] == 0){
    	fibo[n] = fibo[n-1] + fibo[n-2];
    }
    return fibo[n];
}

Bottom up

๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ํŠน์ •๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋ คํ•˜๋Š” ๋ฐฉ๋ฒ•.

fibo(1)๋ถ€ํ„ฐ fibo(10)๊นŒ์ง€ ์ˆœ์ฐจ์ ์œผ๋กœ ์˜ฌ๋ผ์˜ค๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค.
DP๋ฅผ ์ด์šฉํ•œ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด ์†Œ์Šค ์ฝ”๋“œ ์ฐธ๊ณ !!


[์ฐธ์กฐ ๋ธ”๋กœ๊ทธ]

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋™์  ๊ณ„ํš๋ฒ•(Dynamic Programming) - 1
12. ๋™์ ๊ณ„ํš๋ฒ•(Dynamic Programming)
ํ”Œ๋กœ๋ฆฌ๋‹ค์™€์ƒฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

profile
Java Web Developer๐Ÿ˜Š

0๊ฐœ์˜ ๋Œ“๊ธ€