본문 바로가기
백준

[python] 1003. 피보나치 함수

by DylanMsK 2019. 6. 30.

문제 출처

1003. 피보나치 함수

 

풀이

피보나치를 재귀로 짰을때 0과 1이 리턴되는 횟수를 구하는 문제이다. 이 문제를 처음에는 재귀로 풀었는데 시간 복잡도 O(2^N)으로 시간 초과가 났다. 시간을 줄이기 위해 재귀가 아닌 for문을 이용해 이 전에 계산한 결과를 저장해 다음 결과를 도출하는 DP로 풀었더니 시간복잡도가 O(N)이 나왔다.

 

재귀 코드(시간초과)

 


def fib(n):
    global zero, one
    if n == 0:
        zero += 1
        return 0
    elif n == 1:
        one += 1
        return 1
    else:
        return fib(n-1) + fib(n-2)

tc = int(input())
for _ in range(tc):
    n = int(input())
    zero, one = 0, 0
    fib(n)
    print(zero, one)
    

 

DP 코드

 


tc = int(input())
for _ in range(tc):
    n = int(input())
    fibs = [(1, 0), (0, 1)]
    for i in range(2, n+1):
        fibs.append((fibs[i-1][0] + fibs[i-2][0], fibs[i-1][1] + fibs[i-2][1]))
    print(f'{fibs[n][0]} {fibs[n][1]}')

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

[python] 2636. 치즈  (0) 2019.07.04
[python] 7576. 토마토  (0) 2019.07.01
[python] 17086. 아기 상어2  (0) 2019.06.29
[python] 16236. 아기 상어  (0) 2019.06.29
[python] 10825. 국영수  (0) 2019.06.29