[백준/파이썬] 1003번 피보나치 함수 풀이

업데이트:



문제 정보


풀이

문제

int fibonacci(int n) {
    if (n == 0) {
        printf("0");
        return 0;
    } else if (n == 1) {
        printf("1");
        return 1;
    } else {
        return fibonacci(n1) + fibonacci(n2);
    }
}

위 피보나치 함수에서, fibonacci(n)이 n번째 피보나치 수를 의미할 때 fibonacci(n)이 호출되면 0, 1이 몇번 출력되는가?

코드

cnt0 = [1, 0]
cnt1 = [0, 1]

for i in range(2, 41):
    cnt0.append(cnt0[i-1]+cnt0[i-2])
    cnt1.append(cnt1[i-1]+cnt1[i-2])
    
for _ in range(int(input())):
    n = int(input())
    print(cnt0[n], cnt1[n])

설명

해당 피보나치 함수는 n<=1인 경우에 1번, 2인경우에 3번, 3인 경우에 4번… 호출되죠.

좀 더 일반적으로 바꿔보면, n-2인 경우 xn-2, n-1인 경우 xn-1, 번 일 때, n인 경우 xn-2 + xn-1번 호출됩니다.

즉, 해당 함수의 시간복잡도 ~= O( fibonacci( n ) )이 되죠. 이렇게되면 n이 조금만 커져도 수행횟수가 매우 많아집니다.

따라서, 동적 계획법을 이용해야 합니다.

제가 푼 방법에서는 0을 호출한 횟수와 1을 호출한 횟수를 각각 cnt0, cnt1이라는 리스트로 선언하여 메모이제이션으로 씁니다.

cnt0[7]은 fibonacci(7)이 호출되었을 때 0이 사용된 횟수를 의미합니다.

이 리스트 자체는 어떤 n이 와도 사용할 수 있으므로 여러번의 입력이 있더라도 한번만 구하면 됩니다.

이후 테스트 케이스의 수만큼 cnt0[n]과 cnt[1]을 출력해주기만 하면 됩니다.



댓글남기기