✔ 풀이1 (재귀 구조 브루트 포스)
class Solution:
def fib(self, n: int) -> int:
if n <= 1:
return n
return self.fib(n - 1) + self.fib(n - 2)
✔ 풀이2 (메모이제이션)
from collections import defaultdict
class Solution:
dp = defaultdict(int)
def fib(self, n: int) -> int:
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]
✔ 풀이3 (타뷸레이션)
from collections import defaultdict
class Solution:
dp = 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]
✔ 풀이4 (두 변수만 이용해 공간 절약)
class Solution:
def fib(self, n: int) -> int:
x, y = 0, 1
for _ in range(n):
x, y = y, x + y
return x
✔ 풀이1 (메모이제이션)
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
for i in range(1, len(nums)):
nums[i] += nums[i - 1] if nums[i - 1] > 0 else 0
return max(nums)
✔ 풀이2 (카데인 알고리즘)
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
best_sum = float('-inf')
current_sum = 0
for num in nums:
current_sum = max(num, num + current_sum)
best_sum = max(best_sum, current_sum)
return best_sum
✔ 풀이1 (재귀 구조 브루트 포스) Time Limit Exceeded
class Solution:
def climbStairs(self, n: int) -> int:
if n <= 2:
return n
return self.climbStairs(n - 1) + self.climbStairs(n - 2)
✔ 풀이2 (메모이제이션)
from collections import defaultdict
class Solution:
dp = defaultdict(int)
def climbStairs(self, n: int) -> int:
if n <= 2:
return n
if self.dp[n]:
return self.dp[n]
self.dp[n] = self.climbStairs(n - 1) + self.climbStairs(n - 2)
return self.dp[n]
✔ 풀이1 (재귀 구조 브루트 포스) Time Limit Exceeded
class Solution:
def rob(self, nums: List[int]) -> int:
def _rob(idx):
if idx < 0:
return 0
return max(_rob(idx - 1), _rob(idx - 2) + nums[idx])
return _rob(len(nums) - 1)
✔ 풀이2 (타뷸레이션)
from collections import defaultdict
class Solution:
def rob(self, nums: List[int]) -> int:
if len(nums) < 2:
return nums[0]
dp = defaultdict(int)
dp[0], dp[1] = nums[0], max(nums[0], nums[1])
for i in range(2, len(nums)):
dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])
return dp[len(nums) - 1]