접근1
DP.. Top-Down 방식으로 재귀를 이용해 구현.
i번째부터 점프를 시작할 때의 최대 score를 score[i]
라고 저장 (메모이제이션)
그렇게 score[0]을 구해가는 방법.
class Solution: def maxResult(self, nums: List[int], k: int) -> int: lenOfnum = len(nums) # index 'i' 부터 시작했을 때의 최대 score score = {lenOfnum-1: nums[lenOfnum-1]} # end index부터 반대로 순회 def dp(i): a = score.get(i, None) if i + 1 == lenOfnum: return nums[lenOfnum-1] if a != None: return a tempScore = set() for j in range(1, k+1): if i+j < lenOfnum: tempScore.add(dp(i+j)) score[i] = max(tempScore) + nums[i] return score[i] return dp(0)
시간초과.
접근2
그렇다면... Bottom-Up 방식으로 풀어야 시간초과가 안 나는걸까?
Bottom-Up 방식의 for문으로 바꿔봄.
class Solution: def maxResult(self, nums: List[int], k: int) -> int: lenOfnum = len(nums) # index 'i' 부터 시작했을 때의 최대 score score = {lenOfnum-1: nums[lenOfnum-1]} # end index - 1 부터 반대로 순회 for i in range(lenOfnum-2, -1, -1): tempScore = set() for j in range(1, k+1): if i+j < lenOfnum: tempScore.add(score[i+j]) score[i] = max(tempScore) + nums[i] return score[0]
근데도 시간초과.
접근3, 포기
그럼 뭔가 계산과정을 줄일 게 없나 생각해보자..
하고 짜다가.. 도저히 해결법이 안 나옴.
하고 discuss를 봤다..
deque(queue)를 써서 풀이하더라.
class Solution: def maxResult(self, nums: List[int], k: int) -> int: n = len(nums) deq = deque([n-1]) for i in range(n-2, -1, -1): if deq[0] - i > k: deq.popleft() nums[i] += nums[deq[0]] while len(deq) and nums[deq[-1]] <= nums[i]: deq.pop() deq.append(i) return nums[0]
Topic쪽 보니까, 우선순위 큐(힙) 이 있던데..
좀 더 공부해야겠음 ㅎㅎ;