알고리즘/백준

[백준/C] 1003번: 피보나치 함수

이우열 2022. 6. 11. 19:13
728x90

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

 

1003번: 피보나치 함수

각 테스트 케이스마다 0이 출력되는 횟수와 1이 출력되는 횟수를 공백으로 구분해서 출력한다.

www.acmicpc.net


 

 


 

문제 분석

피보나치수열을 순서대로 풀어서 fibonacci(1)과 fibonacci(0)이 호출되는 횟수를 구하는 문제이다.

 

처음 시도했던 코드

#include <stdio.h>
int a=0, b=0;

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

int main(){
	int t;
	scanf("%d", &t);
	
	while(t--){
		int n;
		scanf("%d", &n);
		
		fibonacci(n);
		printf("%d %d\n", a, b);
		a=0;
		b=0;
	}
}

코드 분석

단순하게 수를 입력 받은 후 그 수를 분해해 fibonacci(1)과 fibonacci(0)의 횟수를 누적시켜 출력을 하려고 했다.

하지만 이 코드로는 시간 초과가 되는 것을 확인했다.

이유는 분해를 할 때마다 피보나치 함수를 끝까지 분해해 누적했기 때문에 러닝 타임이 길었다고 생각한다.

 

코드 진행 방향

그 후 문제에 대해 다시 생각하여 작은 수부터 누적하는 방법을 사용하기로 하였다.

fibonacci(0)일 경우는 1 0이 출력되고 fibonacci(1)일 경우는 0 1이 출력된다.

fibonacci(2)일 경우는 fibonacci(1)과 fibonacci(0)의 값의 합인 1 1이 출력된다.

 

이를 2차원 배열을 통해 값을 누적시켜 저장하여 N을 입력하였을 경우

fibonacci(N)은 fibonacci(N-1)과 fibonacci(N-2)의 값만을 구해 시간을 줄이는 방법을 선택했다.

 


 

코드

더보기
#include <stdio.h>
int main(){
	int t;
	scanf("%d", &t);
	
	int fibo[41][2];
	fibo[0][0]=1;
	fibo[0][1]=0;
	fibo[1][0]=0;
	fibo[1][1]=1;
	
	for(int i=2; i<41; i++){
		fibo[i][0]=fibo[i-1][0]+fibo[i-2][0];
		fibo[i][1]=fibo[i-1][1]+fibo[i-2][1];
	}
	
	while(t--){
		int n;
		scanf("%d", &n);
		
		printf("%d %d\n", fibo[n][0], fibo[n][1]);
	}
}
728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준/C] 1008번: A/B  (0) 2022.06.12
[백준/C] 1004번: 어린 왕자  (0) 2022.06.11
[백준/C] 1002번: 터렛  (0) 2022.06.11
[백준/C] 1001번: A-B  (0) 2022.06.11
[백준/C] 1000번: A+B  (0) 2022.06.11