↓↓↓ 아래는 내 리트코드 계정 ↓↓↓
문제 설명
The Fibonacci numbers, commonly denoted F(n) form a sequence, called the Fibonacci sequence, such that each number is the sum of the two preceding ones, starting from 0 and 1. That is,F(0) = 0, F(1) = 1 F(n) = F(n - 1) + F(n - 2), for n > 1.
Given n, calculate F(n).
입출력 예
Example 1:
Input: n = 2 Output: 1 Explanation: F(2) = F(1) + F(0) = 1 + 0 = 1.
Example 2:
Input: n = 3 Output: 2 Explanation: F(3) = F(2) + F(1) = 1 + 1 = 2.
Example 3:
Input: n = 4 Output: 3 Explanation: F(4) = F(3) + F(2) = 2 + 1 = 3.
Constraints
- 0 <= n <= 30
Code
import collections
# 메모이제이션 (하향식) 풀이
class Solution:
dp = collections.defaultdict(int)
def fib(self, N):
if N <= 1:
return N
if self.dp[N]: # 이미 계산된 값은 저장해뒀다가 바로 리턴
return self.dp[N]
self.dp[N] = self.fib(N - 1) + self.fib(N - 2)
return self.dp[N]
DP의 상향식, 하향식 풀이 중 하향식 풀이를 이용했다. 상향식 풀이와 달리, 아래 계산들을 점검하며 이미 계산된 값에 대해서는 두 번 계산하지 않는다는 점에서 더 효율적이다.
# 타뷸레이션 (상향식) 풀이
class Solution:
dp = collections.defaultdict(int)
def fib(self, N):
self.dp[1] = 1
for i in range(2, N + 1):
self.dp[i] = self.dp[i - 1] + self.dp[i - 2] # 작은 값부터 차례로 계산
return self.dp[N]
상향식 풀이는 위와 같다. 이때는 문제의 작은 부분부터 차례로 해결해준다. 한편, N = 5일 때 dp[2]를 2번 계산해야 하는 것처럼 효율이 떨어지는 측면이 있다.
'Programming > #Algorithm' 카테고리의 다른 글
[알고리즘] Leetcode #226 이진 트리 반전 (Python) (0) | 2021.05.25 |
---|---|
[알고리즘] Leetcode #687 가장 긴 동일 값의 경로 (Python) (0) | 2021.05.23 |
[알고리즘] Leetcode #136 싱글 넘버 (Python) (0) | 2021.05.21 |
[알고리즘] Leetcode #122 주식을 사고팔기 가장 좋은 시점 2 (Python) (0) | 2021.05.18 |
[알고리즘] Leetcode #424 가장 긴 반복 문자 대체 (Python) (0) | 2021.05.16 |