Post

๐ŸฆŠ 11. Recursion & Dynamic programming

11. Recursion & Dynamic programming

์ ‘๊ทผ๋ฒ•

์žฌ๊ท€์  ํ•ด๋ฒ•์€, ๋ถ€๋ถ„๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๋ฒ•์„ ํ†ตํ•ด ์™„์„ฑ๋œ๋‹ค.

์ƒํ–ฅ์‹ ์ ‘๊ทผ๋ฒ• (Bottom-up)

์ƒํ–ฅ์‹ ์ ‘๊ทผ๋ฒ•์€ ๊ฐ€์žฅ ์ง๊ด€์ ์ธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

์ด ์ ‘๊ทผ๋ฒ•์€ ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ๋“ค์— ๋Œ€ํ•œ ํ’€์ด๋ฒ•์„ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด

์ด์ „์— ํ’€์—ˆ๋˜ ์‚ฌ๋ก€๋ฅผ ํ™•์žฅํ•˜์—ฌ ๋‹ค์Œ ํ’€์ด๋ฅผ ์ฐพ๋Š”๋‹ค.

ํ•˜ํ–ฅ์‹ ์ ‘๊ทผ๋ฒ• (Top-down)

์–ด๋–ป๊ฒŒ ํ•˜๋ฉด N์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ๋ถ€๋ถ„ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”์ง€ ์ƒ๊ฐํ•ด๋ด์•ผ ํ•œ๋‹ค.

๋‚˜๋‰œ ๋ถ€๋ถ„๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ์„œ๋กœ ๊ฒน์น˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•œ๋‹ค.

๋ฐ˜๋ฐ˜ ์ ‘๊ทผ๋ฒ•

๋ฐ์ดํ„ฐ๋ฅผ ์ ˆ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์ด์ง„ ํƒ์ƒ‰๊ณผ ๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ์ด๋Ÿฐ ์ ‘๊ทผ๋ฒ•์„ ์ด์šฉํ•œ๋‹ค.

์žฌ๊ท€์  ํ•ด๋ฒ• vs. ์ˆœํ™˜์  ํ•ด๋ฒ•

์žฌ๊ท€์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ณต๊ฐ„ ํšจ์œจ์„ฑ์ด ๋‚˜๋น ์งˆ ์ˆ˜ ์žˆ๋‹ค.

์žฌ๊ท€ ํ˜ธ์ถœ์ด ํ•œ ๋ฒˆ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์Šคํƒ์— ์ƒˆ๋กœ์šด ์ธต์ด ์ถ”๊ฐ€๋˜๊ณ 

์žฌ๊ท€์˜ ๊นŠ์ด๊ฐ€ n ์ผ๋•Œ O(n) ๋งŒํผ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์žฌ๊ท€์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆœํ™˜์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ์ˆ˜๋„ ์žˆ๋‹ค.

๋ชจ๋“  ์žฌ๊ท€์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ˆœํ™˜์ ์œผ๋กœ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋•Œ๋กœ๋Š” ๋” ๋ณต์žกํ•˜๋‹ค.

๋™์ ๊ณ„ํš๋ฒ• & ๋ฉ”๋ชจ์ด์ œ์ด์…˜

๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„ ์žฌ๊ท€์  ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ๋ฅผ ์ฐพ์•„๋‚ด๋Š” ๊ฒƒ์ด ๊ด€๊ฑด์ด๋‹ค.

์ด๋ฅผ ์ฐพ์€ ๋’ค์— ๋‚˜์ค‘์„ ์œ„ํ•ด ํ˜„์žฌ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œ์— ์ €์žฅํ•ด๋‘๋ฉด ๋œ๋‹ค.

๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์„ค๋ช…ํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋Š” n๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด๋‹ค.

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

  • ์žฌ๊ท€
1
2
3
4
5
int fibonacci(int i) {
	if (i == 0) return 0;
	if (i == 1) return 1;
	return fibonacci(i - 1) + fibonacci(i - 2);
}

๊ฐ ์žฌ๊ท€ํ˜ธ์ถœ์— ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„์€ O(1) ์ด๊ณ  ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋Š” ๋Œ€๋žต O(2^n) ๊ฐœ์ด๋‹ค.

๋”ฐ๋ผ์„œ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์€ ์•ฝ O(2^n) ์ •๋„๊ฐ€ ๋œ๋‹ค.

  • ํ•˜ํ–ฅ์‹ ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ(๋ฉ”๋ชจ์ด์ œ์ด์…˜)

์žฌ๊ท€ ํŠธ๋ฆฌ๋ฅผ ๊ทธ๋ ค๋ณด๋ฉด ๋งŽ์€ ๋…ธ๋“œ๋“ค์ด ์ค‘๋ณต๋˜์–ด ํ˜ธ์ถœ๋œ๋‹ค.

๋งค๋ฒˆ fib(i) ๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ๋งˆ๋‹ค ์ด ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œํ•˜๊ณ  ์ €์žฅ๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
int fibonacci(int n) {
	return fibonacci(n, new int[n + 1]);
}

int fibonacci(int i, int[] memo) {
	if (i == 0 || i == 1) return i;
	if (memo[i] == 0) {
		memo[i] = fibonacci(i - 1, memo) + fibonacci(i - 2, memo);
	}
	return memo[i];
}
  • ์ƒํ–ฅ์‹ ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๊ตฌํ˜„์„ ์ƒํ–ฅ์‹์œผ๋กœ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์žฌ๊ท€์ ์ธ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์œผ๋กœ ์ ‘๊ทผํ•˜๋˜, ๊ทธ๊ฑธ ๋’ค์ง‘๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.

1
2
3
4
5
6
7
8
9
10
11
int fibonacci(int n){
	if (n == 0) return 0;
	else if (n == 1) return 1;
	int[] memo = new int[n];
	memo[0] = 0;
	memo[1] = 1;
	for (int i = 2; i < n; i++) {
		memo[i] = memo[i - 1] + memo[i - 2];
	}
	return memo[n - 1] + memo[n - 2];
}

memo[i] ๋Š” memo[i+1] ๊ณผ memo[i + 2] ๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ๋งŒ ์‚ฌ์šฉ๋˜๊ณ  ๊ทธ ๋’ค์—๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

๋”ฐ๋ผ์„œ ๋ณ€์ˆ˜ ๋ช‡ ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ’€ ์ˆ˜๋„ ์žˆ๋‹ค.

This post is licensed under CC BY 4.0 by the author.