문제 링크 : https://www.acmicpc.net/problem/1003


해결 방법 :

피보나치 함수를 재귀함수, Top-down 방식으로 푼다고 했을 때 fibonacci(0), fibonacci(1) 의 호출 개수를 각각 출력하는 문제다.

처음에는 단순히 

if(n == 0) 일때 0의 카운트 증가,

if(n == 1) 일때 1의 카운트 증가로 바로 풀수가 있었는데 채점해보니 시간초과가 떴다.. ㅋ


아 그러면 익히알고있는 다이나믹프로그래밍으로 메모를 쓰고 읽어서 시간을 줄여야 되는 구나라고 생각했다.


테스트 케이스를 가지고 여러번 하다보니 다음과 같은 규칙을 발견했다.

N의 0호출 개수는 N-1의 1호출 개수라는 것

example)  5의 0의 호출개수 = 4의 1의 호출개수, 다른것도 직접해보면 알것이다.


따라서 N과 N-1의 피보나치함수를 호출하고 N==1일때 1의 카운팅을 리턴하여서 각각 총 1의 호출개수를 각각 구할 수 있었다. 

이때, 재귀함수에서 여러 N의 1의호출개수를 메모로 저장해둬서(d[N]) 시간을 줄였다.


소스코드)


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
32
33
34
35
36
37
38
#include<stdio.h>
int d[41];
int fibonacci(int n) {
   if(n == 0)
   {
        return 0;
   }
   else if(n==1)
   {
        return 1;
   }
   else if(n < 0)
     return 1;
   else
   {
          if(d[n]> 0return d[n];
          d[n] = fibonacci(n-1+ fibonacci(n-2);
          return d[n];
   }
}
int main()
{
    int n;
    int T;
    int one;
    int zero;
    scanf("%d",&T);
    for(int i =0; i<T; i++)
    {
        scanf("%d",&n);
        one = fibonacci(n);
        zero = fibonacci(n-1);
        
        printf("%d %d\n",zero,one);
    }
}
 
 
cs


반응형

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

1149번 RGB거리  (0) 2018.12.05
7490번 0 만들기  (0) 2018.12.05
1065번 한수  (0) 2018.11.16
1110번 더하기 사이클  (0) 2018.11.14
2448번 별 찍기 - 11  (0) 2018.11.12

+ Recent posts