티스토리 뷰

백준 1003번 : 피보나치 함수

#include <stdio.h> //동적게획법 문제이다.

int fibo[41][3] = {0, }; //[][0] : 피보나치 수, [][1] : return 0; 개수, [][2] : return 1 개수
int input = 0; //입력받기 위한 변수

int find(int n)
{
	fibo[0][1] = 1; 
	fibo[1][2] = 1;
	if(n==0) return 0;
	if(n==1) return 1;
	if(fibo[n][0] == 0)	fibo[n][0] = find(n-1) + find(n-2); //피보나치 수를 찾는다!
	if(fibo[n][1] == 0) fibo[n][1] = fibo[n-1][1] + fibo[n-2][1]; //덤으로 return 0; 
	if(fibo[n][2] == 0) fibo[n][2] = fibo[n-1][2] + fibo[n-2][2]; //덤으로 return 1; 
}

int main(void)
{
	int t = 0; //몇 개
	scanf("%d", &t); //몇 개?
	
	while(t>0)
	{
		scanf("%d", &input); //몇번째 ?	
		find(input); //재귀함수 가동
		printf("%d %d\n", fibo[input][1], fibo[input][2]); //출력
		t--; //횟수감소
	}
	return 0;
}

 

동적 계획법 :처음 진행한 연산을 기록!!!! -> 똑같은 걸 여러 번 하지 않으니 시간이 빨라진다.

 

  • 조건

1. 몇 번째 피보나치수를 구할 때, 재귀 함수에서 n=0일 때와, n=1일 때를 얼마나 지나치는 가?

 

  • 풀이

피보나치 수를 구하는 재귀함수에서, n=0, n=1을 얼마나 지나갔는지를 추가했다.

 

fibo[0][1] = 1; //n=0일 때 return 0;을 한 번 지남

fibo[1][2] = 1; //n=1일 때 return 1;을 한 번 지남

 

if(fibo[n][1] == 0) //처음에는 값을 대입하되, 이를 저장, 그다음부터는 더 이상 대입하지 않아도 됨.

if(fibo[n][2] == 0)

 

                         

      find(4)    
    find(3)     find(2)  
  find(2)   find(1) find(1)   find(0)
find(1)   find(0)        
             
피보나치 수

입력 

1

4

 

과정 (좌->우, 그 다음 위-> 아래)

find(4) 시작 find(3) find(2) find(1)
      find(0)
    find(1)  
  find(2) find(1)  
    find(0)  
find(4) 종료      

 여기서 fino[2][0], fino[2][1], fino[2][2]값이 구해지고 저장된다.

여기선 대입이 일어나지 않는다. 즉 다시 fino[2][0], fino[2][1], fino[2][2]을 구하지 않는다.

 

 

출력

2 3

 

 

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함