-
[파이썬] 리트코드 509. Fibonacci Number 풀이기타/알고리즘 2020. 12. 22. 11:27반응형
https://leetcode.com/problems/fibonacci-number/
Fibonacci Number - LeetCode
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
다이나믹 프로그래밍에는 상향식 방법과 하향식 방법이 존재한다.
상향식 방법은 타뷸레이션이라는 것인데, 작은 문제의 정답을 이용해 큰 문제의 정답을 풀어나가는 방식이다.
작은 문제들의 계산을 다 해두고 결과값을 저장해뒀다가 필요한 결과값을 반환하는 식이다.
range(2,n+1)의 모든 숫자에 대해 결과를 계산하는데
1. 각각의 계산값을 dp라는 리스트에 저장하여 기억하고
2. 각각의 작은 계산값을 이용해서 더 큰 계산을 해준다
다이나믹 프로그래밍의 특징이 잘 드러나는 방법이다
class Solution: dp = collections.defaultdict(int) def fib(self, n: int) -> int: 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] #dp 자체에 값을 저장하기.
하향식 방법은 메모이제이션이라고 한다. 범위 안의 모든 수에 대해 계산하여 값을 기억하는 것이 아니라, 계산 유무를 확인하며 나아간다는 점이 특징이다. 재귀로 풀 때와 비교했을 때, 계산은 재귀로 하면서도 결과값을 저장한다는 점만 차이난다. 그래서 조금 더 수월하게 풀 수 있는 방법이기도 하다.
class Solution: dp = collections.defaultdict(int) def fib(self, n: int) -> int: if n<= 1: return n #n 값이 1보다 작다면 n을 반환한다 if self.dp[n]: return self.dp[n] #dp[n]이 존재한다면(계산되어 있다면) dp[n]을 반환한다 self.dp[n] = self.fib(n-1) + self.fib(n-2) #dp[n]에 값이 없다면(아직 계산하지 않았다면) 계산해준다 return self.dp[n]
이 두 방식 모두 재귀로 푸는 것보다 훨씬 빠르고 효율적이다
반응형'기타 > 알고리즘' 카테고리의 다른 글
[파이썬] 리트코드 78. Subsets 풀이 (0) 2020.12.24 [파이썬] 다이나믹 프로그래밍 기초 (0) 2020.12.23 백준 파이썬 18352 : 특정 거리의 도시 찾기 풀이 (0) 2020.12.22 백준 파이썬 2667번 : 단지번호 붙이기 풀이 (0) 2020.12.19 백준 파이썬 2583번 : 영역 구하기 풀이 (0) 2020.12.18