티스토리 뷰
Problem
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.
Example 1:
Input: nums = [2,3,1,1,4]
Output: true
Explanation: Jump 1 step from index 0 to 1, then 3 steps to the last index.
Example 2:
Input: nums = [3,2,1,0,4]
Output: false
Explanation: You will always arrive at index 3 no matter what. Its maximum jump length is 0, which makes it impossible to reach the last index.
Constraints:
- 1 <= nums.length <= 10^4
- 0 <= nums[i] <= 10^5
Solution
각 값이 최대 점프 길이를 가지는 배열이 주어졌을 때 첫 번 째 위치에서 시작하여 마지막 위치에 도달할 수 있는지 확인하는 문제입니다.
public class Solution {
public boolean canJump(int[] nums) {
if (nums.length <= 1) { // (1)
return true;
}
int max = nums[0];
for (int i = 0; i < nums.length; i++) {
if (max <= i && nums[i] == 0) { // (2)
return false;
}
if (i + nums[i] > max) { // (3)
max = i + nums[i];
}
if (max >= nums.length - 1) { // (4)
return true;
}
}
return false;
}
}
(1) 길이가 1 이하이면 무조건 마지막 인덱스에 도달할 수 있으므로 true를 반환합니다.
(2) 현재 최대로 도달할 수 있는 값을 max라고 할 때 max 값이 i보다 작거나 같고 인덱스 i에 해당하는 값이 0일 경우 마지막까지 도달할 수 없으므로 false를 반환합니다.
(3) max의 값을 현재 인덱스 + 현재 인덱스에 해당하는 값을 더해 최대로 도달할 수 있는 인덱스 값으로 갱신합니다.
(4) max값이 배열의 길이보다 크거나 같으면 true를 반환합니다.
제출하고 다른 사람들의 답을 확인해보니 훨씬 더 간단한 방법이 있어 소개합니다.
public class Solution {
public boolean canJump(int[] nums) {
int distance = 0;
for (int i = 0; i <= distance; i++) {
distance = Math.max(distance, i + nums[i]);
if (distance >= nums.length - 1) {
return true;
}
}
return false;
}
}
처음 소개한 풀이보다 훨씬 단순하네요. 😅
Test
package io.lcalmsky.leetcode.jump_game;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;
class SolutionTest {
@Test
void givenArray_whenJump_thenCorrect() {
assertAll(
() -> test(new int[]{2, 3, 1, 1, 4}, true),
() -> test(new int[]{3, 2, 1, 0, 4}, false)
);
}
private void test(int[] given, boolean expected) {
// when
Solution jumpGame = new Solution();
boolean actual = jumpGame.canJump(given);
// then
assertEquals(actual, expected);
}
}
'Algorithm > LeetCode' 카테고리의 다른 글
[LeetCode - Daily Challenge] 70. Climbing Stairs (0) | 2021.10.06 |
---|---|
[LeetCode - Daily Challenge] 463. Island Perimeter (0) | 2021.10.05 |
[LeetCode - Daily Challenge] 174. Dungeon Game (0) | 2021.10.02 |
[LeetCode - Daily Challenge] 698. Partition to K Equal Sum Subsets (0) | 2021.10.01 |
[LeetCode - Daily Challenge] 725. Split Linked List in Parts (0) | 2021.09.30 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 함께 자라기 후기
- gRPC
- proto3
- JSON
- intellij
- r
- 클린 아키텍처
- leetcode
- 스프링 부트 회원 가입
- Spring Boot Tutorial
- Jackson
- @ManyToOne
- spring boot jwt
- 스프링 부트 튜토리얼
- QueryDSL
- Spring Data JPA
- 스프링 부트
- Java
- JPA
- 헥사고날 아키텍처
- Linux
- 알고리즘
- Spring Boot
- spring boot application
- 스프링 부트 애플리케이션
- 스프링부트
- spring boot app
- Spring Boot JPA
- 함께 자라기
- 스프링 데이터 jpa
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함