백준(C언어) 풀이/다이나믹 프로그래밍

백준(C) 2748번 피보나치 수2 풀이

개발윗미 2021. 9. 17. 18:46

C로 구현한 2748번 피보나치 수2 문제 풀이입니다.

 

https://www.acmicpc.net/problem/2748

 

2748번: 피보나치 수 2

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가

www.acmicpc.net


#include <stdio.h>

long long d[91];

long long fibo(int x) {
	if (x == 1) 
		return 1;
	if (x == 2)
		return 1;
	if (d[x] != 0)
		return d[x];
	return d[x] = fibo(x - 1) + fibo(x - 2);
}

int main() {
	int num;
	scanf("%d", &num);
	printf("%lld", fibo(num));
}

 

문제에서 요구하는 바와 같이 특정번째의 피보나치 수를 구한다.

 

fibo( ) 메소드에서 전달받은 값이 1 혹은 2 라면 1을 리턴한다. 피보나치 수의 첫번째, 두번째 값은 1이기 때문이다.

 

또한, 전달받은 값이 1 혹은 2가 아니라면 배열 d의 해당 인덱스 값이 0이 아닌지 판별하여 0이 아니라면 그 값을 리턴한다.

 

위 조건도 만족하지 않는다면 재귀 호출하는 방식으로 x - 1 번째 수와 x - 2 번째 수를 더하여 리턴한다.

 

주의할 점은 문제에서 수를 입력할 때의 범위는 90보다 작거나 같은 자연수이다.

 

배열 d와 fibo( ) 메서드의 데이터 타입이 int 형이라면 90이 입력되었을 때 허용범위를 벗어나기 때문에 

 

long long 타입으로 선언하여 처리하도록 한다.