문제 링크: https://leetcode.com/problems/jump-game/?envType=study-plan-v2&envId=top-interview-150
주어진 조건
문제
처음에는 DP를 생각했었다.
따라서 nums=[2, 3, 1, 1, 4]일 경우, index = 0에서 한 칸 점프하는 경우, 두 칸 점프하는 경우 둘 다 고려해서 계산을 해야되므로 재귀함수를 사용해 nums의 마지막 index까지 도달하는 지 계산을 해야하나..? 싶었지만 시간초과였다.
그렇다면, DP가 아니라 한 번의 탐색으로 해결할 수는 없을까 고민하다가 나온 방법의 핵심이 아래 사진이다.
nums = [2, 3, 1, 1, 4] 일 경우를 생각해보자.
nums[i]에서 점프하여 갈 수 있는 칸은 nums[i] ≤ nums[i+1] 가 성립한다면, nums[i+1]에서도 갈 수 있다.
바로 이게 아이디어의 핵심이었다.
class Solution(object):
def canJump(self, nums):
if len(nums) == 1:
return True
if nums[0] == 0:
return False
count = nums[0]
for i in range(1, len(nums)):
count -= 1
if count < 0:
break
if nums[i] >= count and i != len(nums) - 1:
count = nums[i]
return count >= 0
55. Jump Game
길이가 1이거나, 첫 번째 요소가 0인 것을 미리 처리
count는 현재 점프할 수 있는 최대 길이
count를 하나씩 감소시키며 nums 탐색
Time: O(n)
Space: O(1)
class Solution:
def canJump(self, nums: List[int]) -> bool:
last_position = len(nums)-1
for i in range(len(nums)-2,-1,-1):
if (i + nums[i]) >= last_position:
last_position = i
return last_position == 0
이전 index에서 마지막 index에 도달하려면 어떻게 해야할까?
→ 바로 index + nums[index] ≥ nums 마지막 index
가 성립하면 된다
위 아이디어를 이용해 이 풀이는 마지막 원소부터 for문을 실행한다.
⇒ last_position이 0이라는 이야기는 결국, index 0에서 마지막 위치까지 도달 가능하다는 이야기이다!
Time: O(n)
Space: O(1)
이런 DP가 떠오르는 종류의 문제는 넓게 보지말고, 좀 더 좁게 볼 필요가 있는 것 같다. 이전 index에서 마지막 index에 도달하는 방법
이라든가, 이웃한 값의 관계라든가
문제를 작은 문제부터 바라봤으면, 아이디어를 쉽게 떠올렸을 문제인 것 같다.