Algorithm

백준 알고리즘 파이썬(Python) 2747번 피보나치 수

🤖 Play with Android 🤖 2021. 8. 3. 13:08
728x90


만약 이를 재귀 함수로만 문제를 풀게 된다면 아래 그림과 같이 재귀 함수가 n을 인자로 호출되면 그 함수는

n-1과 n-2를 인자로 함수를 호출하고, 호출된 각 함수가 계속해서 함수를 두 개씩 호출하게 되므로 

만약 n이 100이라면 이 구조의 기반한 문제풀이라면 컴퓨터가 1초에 1억 번의 계산을 수행한다 해도 수백억 년이 걸린다.

이러한 문제를 다이나믹 프로그래밍(DP)을 이용하여 간단하게 해결할 수 있다.

 

다이나믹 프로그래밍이란 간단히 말해서 큰 문제를 작게 나누고, 같은 문제라면 한 번씩만 풀어 문제를 효율적으로 해결하는 알고리즘 기법이다.

 

 

n = int(input())
d = [0] * (n+1) #단순히 재귀적으로 풀 때 과도한 시간이 걸리는 것을 방지하기 위해 dp로 풀어준다.

if n == 1:
    d[1] = 1
    print(d[1])
elif n == 2:
    d[2] = 1
    print(d[2])
else:
    d[1] = 1 #인덱스 에러를 해결하기 위해 이렇게 써주어야 한다.
    d[2] = 1
    for i in range(3,n+1):
        d[i] = d[i-1] + d[i-2] # 재귀함수를 이용해 풀이
    print(d[n])

위와 같은 문제풀이 방식을 보텀업 방식 즉 상향식 방법이라고 한다. 이는 다이나믹 프로그래밍의 전형적인 방법이다.

보텀업 방식에서 사용되는 결과 저장용 리스트는 'DP 테이블' 이라고 부른다. (위 코드에서는 d가 DP 테이블)