You are given an integer array nums. You are initially positioned at the array's first index, and each element in the array represents your maximum jump length at that position.
Return true
if you can reach the last index, or false
otherwise.
0
)에서 시작해서 끝까지 (index = nums.length - 1
)도달할 수 있는가?nums
맨 앞에서부터 계산해 나갈 경우에는 과정이 매우 복잡해진다.
5
이라고 해보자. 이는 처음에 5칸 이동했을 때 끝까지 도달이 안된다고 해서 4
, 3
, 2
, 1
칸 이동했을 때 안된다는 보장이 없다. 그래서 각 경우마다 전부 생각해 보아야 한다.뒤에서부터 하나씩 생각해보는 것이 매우 유리하다.
2
를 보자. 문제의 구조 상 다다음 칸으로 갈 수 있다면 무조간 다음 칸으로 갈 수 있다는 것이 보장되어 있다.checkPoint
를 계속 설정하고 그 다음 칸에서 해당 checkPoint
에 도달할 수 있는지 여부만 계속 판단한다면 도달 여부를 쉽게 판단할 수 있다curDistance
를 설정 (현재 위치에서 체크포인트까지의 거리를 의미)nums
를 뒤에서부터 순회하면서nums[i]
의 값이 curDistance
보다 큰 경우 (체크포인트에 도달할 수 있는 경우), curDistance
의 값을 초기화 (현 위치가 체크포인트가 되고 체크포인트까지의 거리가 0로 줄었기 때문에)curDistance
값을 1 증가 (이동할 때마다 체크포인트 까지의 거리가 늘어남class Solution {
public boolean canJump(int[] nums) {
int curDistance = 1;
for (int i = nums.length - 2; i >= 0; i--) {
if (nums[i] >= curDistance) {
curDistance = 0;
}
curDistance++;
}
return curDistance == 1;
}
}