개발/python

[백준 2748번] 피보나치 수 2 - python

dotudy 2025. 8. 19. 23:46

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

📌 문제 탐색하기

목표

  • 피보나치 수열 계산해서 n 번째 피보나치 수 구하기

입력값

  • n이 주어진다. (1 ≤ n ≤ 90)
    • ex)
    • 10

출력값

  • n번째 피보나치 수를 구해서 반환한다.
    • ex)
    • 55

📌 코드 설계하기

해결 아이디어

  • 흔히 생각하는 일반 피보나치 수열은 재귀를 쓰기 때문에 시간 복잡도가 굉장히 크다. 따라서 시간 제한이 1초로 제한되어있으니 dp를 사용해서 구현해보자.
  • dp를 쓰기 위해서는 배열을 정의해야 한다.
  • 한 번 fibo(n)을 구하면 배열에 해당 값을 저장한다. 다시 fibo(n)이 필요하면 다시 재귀를 호출하지 않고 저장된 값을 꺼내 쓰도록 하는 것이다. 이렇게 하면 숫자는 단 한 번만 계산된다.

📌 Trouble Shooting

1차 시도

import sys

def fibo(n):
    if arr[n]>0:
        return arr[n]
    if n < 2:
        return n
    else:
        arr[n] = fibo(n-1) + fibo(n-2)
        return arr[n]
    
arr= [0] * 90
n = int(sys.stdin.readline())
print(fibo(n))

  • 나름 DP를 써보겠다고 썼는데 런타임 에러 (IndexError) 가 발생했다.
  • 고민해보니 arr[0] * 90을 하면 인덱스는 0~89까지만 유효해서 90이 들어오면 index out of range가 나오게 된다.
  • 그러면 상한을 늘려주거나 n을 입력 받고 난 후에 배열을 초기화해주면 해결되겠다.

📌 정답 코드

import sys

def fibo(n):
    if arr[n]>0:
        return arr[n]
    if n < 2:
        return n
    else:
        arr[n] = fibo(n-1) + fibo(n-2)
        return arr[n]
    
n = int(sys.stdin.readline())
arr= [0] * (n+1)

print(fibo(n))

시간 복잡도 계산해보기

  • fibo()
    • arr[n]이 있기 때문에 같은 n을 두 번 이상 계산하지 않음.
    • fibo(n)은 fibo(n-1), fibo(n-2) … → fibo(0)까지 딱 한 번씩만 실행된다.
    • 따라서 시간 복잡도는 O(N)이 된다.

최종 시간 복잡도: O(N)