-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add post '(Leetcode) 55 - Jump Game 풀이'
- Loading branch information
1 parent
ba41447
commit 4fe6fb8
Showing
1 changed file
with
155 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,155 @@ | ||
--- | ||
layout: post | ||
title: (Leetcode) 55 - Jump Game 풀이 | ||
categories: [스터디-알고리즘] | ||
tags: | ||
[ | ||
자바, | ||
java, | ||
리트코드, | ||
Leetcode, | ||
알고리즘, | ||
greedy, | ||
dynamic programming, | ||
dp, | ||
dfs, | ||
] | ||
date: 2024-07-17 02:30:00 +0900 | ||
toc: true | ||
--- | ||
|
||
기회가 되어 [달레님의 스터디](https://github.com/DaleStudy/leetcode-study)에 참여하여 시간이 될 때마다 한문제씩 풀어보고 있다. | ||
|
||
[https://neetcode.io/practice](https://neetcode.io/practice) | ||
|
||
--- | ||
|
||
[https://leetcode.com/problems/jump-game](https://leetcode.com/problems/jump-game) | ||
|
||
## dfs로 풀기 | ||
|
||
```java | ||
class Solution { | ||
boolean canJump = false; // 마지막 위치에 도착 할 수 있으면 true 로 변경 | ||
|
||
public boolean canJump(int[] nums) { | ||
dfs(nums, 0); | ||
|
||
return canJump; | ||
} | ||
|
||
private void dfs(int[] nums, int pointer) { | ||
// 위치가 범위를 벗어났을 경우 | ||
// 이미 방문한 위치일 경우 | ||
// 이미 마지막에 도달 가능하다는 것을 확인했을 경우 | ||
if (pointer >= nums.length || nums[pointer] == -1 || canJump) { | ||
return; | ||
} | ||
|
||
int maxHeight = nums[pointer]; | ||
nums[pointer] = -1; | ||
|
||
// 마지막이 아닌데 0 이 나왔을 경우 이동 불가능 | ||
if (maxHeight == 0 && pointer != nums.length - 1) { | ||
return; | ||
} | ||
|
||
if (pointer == nums.length - 1) { | ||
canJump = true; | ||
} else { | ||
while (maxHeight > 0) { | ||
dfs(nums, pointer + maxHeight); | ||
maxHeight--; | ||
} | ||
} | ||
} | ||
} | ||
``` | ||
|
||
### TC, SC | ||
|
||
시간복잡도는 `O(n^2)`, 공간복잡도는 `O(n)` 이다. | ||
|
||
## dp로 풀기 | ||
|
||
중간에 도달하지 못하는 위치가 있을 경우 false를 반환한다. dp 라고 해도 되려나 애매한 것 같다. | ||
|
||
```java | ||
class Solution { | ||
public boolean canJump(int[] nums) { | ||
int[] dp = new int[nums.length]; | ||
int lastIndex = nums.length - 1; | ||
dp[0] = 1; | ||
|
||
for (int i = 0; i < nums.length; i++) { | ||
if (dp[i] == 0) { | ||
return false; | ||
} | ||
|
||
int current = nums[i]; | ||
int toIndex = i + current + 1; | ||
if(toIndex > lastIndex) { | ||
toIndex = nums.length; | ||
} | ||
Arrays.fill(dp, i, toIndex, 1); | ||
if (dp[lastIndex] > 0) { | ||
return true; | ||
} | ||
} | ||
|
||
return dp[lastIndex] != 0; | ||
} | ||
} | ||
``` | ||
|
||
### TC, SC | ||
|
||
시간복잡도는 `O(n^2)`, 공간복잡도는 `O(n)` 이다. | ||
|
||
## greedy 방식으로 풀기 | ||
|
||
```java | ||
class Solution { | ||
public boolean canJump(int[] nums) { | ||
int maxReach = 0; // 현재까지 도달할 수 있는 가장 먼 인덱스 | ||
|
||
for (int i = 0; i < nums.length; i++) { | ||
if (i > maxReach) { | ||
return false; // 현재 인덱스에 도달할 수 없는 경우 | ||
} | ||
maxReach = Math.max(maxReach, i + nums[i]); | ||
if (maxReach >= nums.length - 1) { | ||
return true; // 마지막 인덱스에 도달하거나 그 이상일 경우 | ||
} | ||
} | ||
|
||
return false; | ||
} | ||
} | ||
``` | ||
|
||
### TC, SC | ||
|
||
시간복잡도는 `O(n)`, 공간복잡도는 `O(1)` 이다. | ||
|
||
## leetcode에 있던 또 다른 풀이 | ||
|
||
```java | ||
class Solution { | ||
public boolean canJump(int[] nums) { | ||
int currentIndex = nums.length - 1; | ||
|
||
for (int i = nums.length - 2; i >= 0; i--) { | ||
if (i + nums[i] >= currentIndex) { | ||
currentIndex = i; | ||
} | ||
} | ||
|
||
return currentIndex == 0; | ||
} | ||
} | ||
``` | ||
|
||
### TC, SC | ||
|
||
시간복잡도는 `O(n)`, 공간복잡도는 `O(1)` 이다. |