-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Labels
Description
문제 설명 | Jump Game
정수 배열 nums가 주어집니다. 처음에는 배열의 첫 번째 인덱스에 위치하며, 배열의 각 요소는 해당 위치에서 최대 점프 길이
마지막 인덱스에 도달할 수 있으면 true를, 그렇지 않으면 false를 반환
📝 제약조건
1 <= nums.length <= 10^40 <= nums[i] <= 10^5
💡 예시
-
Input: nums = [2,3,1,1,4]
- Output: true
- 설명: 인덱스 0에서 1으로 1단계 점프한 다음, 3단계를 점프하여 마지막 인덱스에 도달
-
Input: nums = [3,2,1,0,4]
- Output: false
- 설명: 무엇을 하든 항상 인덱스 3에 도달합니다. 최대 점프 길이는 0이므로 마지막 인덱스에 도달할 수 없음
문제 해결 과정
Step 1: 문제 이해하기
- 작은 예시로 직접 점프 게임 이해하기
- [2,3,1,1,4]에서:
- 인덱스 0에서 시작, 최대 2칸 점프 가능 → 인덱스 1 또는 2로 갈 수 있음
- 인덱스 1로 가면 최대 3칸 점프 가능 → 바로 마지막 인덱스(4)에 도달 가능
- [3,2,1,0,4]에서:
- 인덱스 0에서 시작, 최대 3칸 점프 가능 → 어디를 가든 결국 인덱스 3에 도달
- 인덱스 3의 값은 0이므로 더 이상 점프할 수 없음 → 마지막 인덱스 도달 불가
- [2,3,1,1,4]에서:
Step 2: 접근 방법
-
직관적으로 생각하기
- 처음엔 앞에서부터 접근할 수 있다고 생각하겠지만, 뒤에서부터 접근하는 방식이 효율적
- 마지막 인덱스에서 시작해 첫 번째 인덱스까지 역순으로 진행
- 목표 인덱스(goal)에 도달할 수 있는 위치를 계속 업데이트
-
알고리즘 표 작성
goal = 마지막 인덱스 (nums.length - 1)
↓
i = 마지막 인덱스부터 0까지 역순으로 순회
↓
현재 위치(i)에서 nums[i]만큼 점프 가능
↓
i + nums[i] >= goal인지 확인
↓
맞다면 → goal = i (목표 지점 업데이트)
아니면 → 다음 인덱스로 이동
↓
최종적으로 goal이 0이면 성공 (처음부터 끝까지 도달 가능)
Step 3: 코드 설계
- 목표 인덱스(goal)를 마지막 인덱스로 초기화
- 마지막 인덱스부터 0까지 역순으로 순회:
- 현재 위치에서 최대 점프로 목표에 도달 가능한지 확인
- 가능하다면 목표 위치를 현재 위치로 업데이트
- 최종적으로 목표가 첫 번째 인덱스(0)인지 확인
Step 4: 코드 구현
/**
* @param {number[]} nums
* @return {boolean}
*/
var canJump = function(nums) {
// 목표 인덱스를 마지막 인덱스로 초기화
let goal = nums.length - 1;
// 뒤에서부터 앞으로 순회
for(let i = nums.length - 1; i >= 0; i--) {
// 현재 위치에서 점프하여 목표에 도달할 수 있는지 확인
if(i + nums[i] >= goal) {
// 가능하다면 목표를 현재 위치로 업데이트
goal = i;
}
}
// 목표가 첫 번째 인덱스라면 성공
return goal === 0;
};