๐Ÿ‘ฉโ€๐Ÿ’ป ํ”„๋กœ๊ทธ๋ž˜๋ฐ/๐ŸŽ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋™์  ๊ณ„ํš๋ฒ•(dynamic programming) feat. ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด

peewoong 2024. 3. 27. 15:53

๋ถ„ํ• ํ•œ ๋ฌธ์ œ์˜ ๋‹ต์„ ๊ธฐ์–ตํ•ด ๋‘๊ณ , ์ด๋ฅผ ์žฌ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ํ‘ธ๋Š” ๋‚ญ๋น„๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•

์ƒํ–ฅ์‹ ์ ‘๊ทผ๋ฐฉ๋ฒ•

 

๐ŸŸฉ ํŠน์ง•

๊ฐ ์†Œ๋ฌธ์ œ๋Š” ์›๋ž˜ ์ฃผ์–ด์ง„ ๋ฌธ์ œ์™€ ๋™์ผํ•œ ๋ฌธ์ œ ๐Ÿ‘‰ ์ž…๋ ฅ ํฌ๊ธฐ๋งŒ ์ž‘์•„์ง„ ๋ฌธ์ œ

์†Œ๋ฌธ์ œ๋“ค์€ ์„œ๋กœ ๋…๋ฆฝ์ผ ํ•„์š”์—†๋‹ค.

ํ•ด๋ฅผ  ๊ตฌ์ถ•ํ•˜๋Š”๋ฐ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

์ตœ์†Ÿ๊ฐ’/์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ์ตœ์ ํ™” ๋ฌธ์ œ์— ์ฃผ๋กœ ์‚ฌ์šฉ

"์ตœ์ ์„ฑ์˜ ์›๋ฆฌ"๋ฅผ ๋ฐ˜๋“œ์‹œ ๋งŒ์กฑํ•˜๋Š” ๋ฌธ์ œ์—๋งŒ ์ ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ฃผ์–ด์ง„ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ตœ์ ํ•ด๋Š” ์ฃผ์–ด์ง„ ๋ฌธ์ œ์˜ ์†Œ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ตœ์ ํ•ด๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

 

๐ŸŸฉ ์ฒ˜๋ฆฌ ๊ณผ์ •

1. ์ตœ์ ์„ฑ์˜ ์›๋ฆฌ๊ฐ€ ์ฃผ์–ด์ง„ ๋ฌธ์ œ์— ์„ฑ๋ฆฝํ•˜๋Š” ์ง€  ํ™•์ธ

2. ์ฃผ์–ด์ง„ ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ ์ตœ์ ํ•ด๋ฅผ ์ œ๊ณตํ•œ๋А ์ ํ™”์‹ ๋„์ถœ

3. ๊ฐ€์žฅ ์ž‘์€ ์†Œ๋ฌธ์ œ๋ถ€ํ„ฐ ์ ํ™”์‹์˜ ํ•ด๋ฅผ ๊ตฌํ•œ ๋’ค ์ด๋ฅผ ํ…Œ์ด๋ธ”์— ์ €์žฅ

4. ํ…Œ์ด๋ธ”์— ์ €์žฅ๋œ ์†Œ๋ฌธ์ œ์˜ ํ•ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์ ์ฐจ์ ์œผ๋กœ ์ž…๋ ฅ์˜ ํฌ๊ธฐ๊ฐ€ ํฐ ์ƒ์œ„ ๋ฌธ์ œ์˜ ํ•ด๋ฅผ ๊ตฌํ•ด ๋‚˜๊ฐ

 

๐ŸŒŸ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด (๋ถ„ํ•  ์ •๋ณต ๋ฐฉ๋ฒ•)

์•ž์˜ ๋‘ ์ˆ˜ ๋”ํ•œ ๊ฐ’์ด ์ดํ›„์˜ ๊ฐ’

#include <stdio.h>

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

int main(void) {
	int n;
	for (n = 0; n < 8; ++n) {
		printf("%d, ", fibonacci(n));
	}
	printf("\n");

	return 0;
}

 

๋ฌธ์ œ์  : ๊ฐ™์€ ์ธ์ˆ˜์ด๋ฉด ๋ฐ˜ํ™˜๊ฐ’๋„ ๋™์ผํ•˜๋ฏ€๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ฐ™์€ ์ธ์ˆ˜๋กœ ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ๋‚ญ๋น„

๐Ÿ‘‰ ๋™์  ๊ณ„ํš๋ฒ•์œผ๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ

 

๐ŸŒŸ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด (๋™์  ๊ณ„ํš๋ฒ•)

#include <stdio.h>
#define LENGTH 100

int fibonacciNumbers[LENGTH];

int fibonacci(int n) {
	for (int i = 0; i <= n; ++i) {
		if (i == 0) {
			fibonacciNumbers[i] = 0;
		}
		else if (i == 1) {
			fibonacciNumbers[i] = 1;
		}
		else {
			fibonacciNumbers[i] = fibonacciNumbers[i - 1] + fibonacciNumbers[i - 2];
		}
	}

	return fibonacciNumbers[n];
}

int main(void) {
	for (int n = 0; n <= 8; ++n) {
		printf("%d, ", fibonacci(n));
	}
	printf("\n");

	return 0;
}

 

์žฌ๊ท€ํ˜ธ์ถœ๊ณผ ๋™์  ๊ณ„ํš๋ฒ•์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋”์šฑ ํšจ์œจ์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์ดˆ๊ธฐํ™” ์ฒ˜๋ฆฌ ํ•จ์ˆ˜ ์ถ”๊ฐ€. ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ๋ฐฐ์—ด์˜ ์š”์†Ÿ๊ฐ’์„ ๋ชจ๋‘ -1๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. -1์€ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๊ฐ€ ๊ตฌํ•ด์ง€์ง€ ์•Š์•˜์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. -1๋กœ ํ•œ ์ด์œ ๋Š” ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋Š” 0 ์ด์ƒ์˜ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

๋™์  ๊ณ„ํš๋ฒ•์œผ๋กœ ์žฌ๊ท€ ํ˜ธ์ถœ์˜ ๋‚ญ๋น„๋ฅผ ํ”ผํ•œ๋‹ค.

#include <stdio.h>
#define LENGTH 100

int fibonacciNumbers[LENGTH];

void initFibonacciNumbers() {
	for (int i = 0; i < LENGTH; ++i) {
		fibonacciNumbers[i] = -1;
	}
}

int fibonacci(int n) {
	printf("fibonacci(%d)๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.\n", n);

	if (fibonacciNumbers[n] == -1) {
		if (n == 0) {
			fibonacciNumbers[n] = 0;
		}
		else if (n == 1) {
			fibonacciNumbers[n] = 1;
		}
		else {
			fibonacciNumbers[n] = fibonacci(n - 1) + fibonacci(n - 2);
		}
	}

	return fibonacciNumbers[n];
}

int main(void) {
	initFibonacciNumbers();

	printf("5๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ = %d\n", fibonacci(5));
	printf("\n");

	return 0;
}

 

 

๐Ÿš€ ํ™œ์šฉ1 ๋ชจ๋“  ์ •์  ์Œ ๊ฐ„์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ

๐Ÿ‘‰ ํ”Œ๋กœ์ด๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

๐Ÿš€ ํ™œ์šฉ2 ํ–‰๋ ฌ

๐Ÿ‘‰ ํ–‰๋ ฌ์˜ ์—ฐ์‡„์  ๊ณฑ์…ˆ ๋ฌธ์ œ

๐Ÿ‘‰ ์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด ๋ฌธ์ œ

๋Œ“๊ธ€์ˆ˜0