Algorithm

백준 2747번 피보나치 수 (DP)

알로그 2020. 1. 12. 13:06
반응형

DP를 배울 때, 가장 첫 번째로 등장하는 문제라고 할 수 있다.

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

 

2747번: 피보나치 수

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n>=2)가 된다. n=17일때 까지 피보나치 수를 써보면 다음과 같다. 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597 n이 주어졌을 때, n번째 피보나치 수를 구하는

www.acmicpc.net

 

피보나치 점화식은 문제에서 바로 주어지기 때문에, 딱히 설명하지는 않겠다.

 

포인트는 메모이제이션으로 변수 memo에 이전에 계산했던 값을 저장해놓기 위함이다.

피보나치 함수의 특성상 중복되어서 계산하는 부분이 많다.

예를들어 fib(5) = fib(4) + fib(3)인데, fib(4)를 구하기 위해서는 fib(3)+fib(2)를 구해야 한다.

이때, fib(3)이 중복되므로 미리 계산한 값을 memo에 넣어놓고 이 값이 0이 아니면 그 전에 계산했다는 의미이므로 return memo[n]을 하도록 한다.

 

<소스코드>

memo = [0] * 46

def fib(n) :
    if n <= 1:
        return n
    elif memo[n] != 0 :
        return memo[n]
    else :
        memo[n] = fib(n-1) + fib(n-2)
        return memo[n]

n = int(input())
print(fib(n))

 

반응형

'Algorithm' 카테고리의 다른 글

백준 1463번 1로 만들기 (DP)  (0) 2020.01.12
백준 2579번 계단 오르기 (DP)  (0) 2020.01.12
백준 14503번 로봇청소기 (DFS)  (0) 2019.10.12
백준 14890번 경사로 (Simulation)  (0) 2019.10.12
백준 16236번 아기상어 (BFS)  (0) 2019.10.11