๋ฌธ์
https://leetcode.com/problems/frog-jump/description/
๊ฐ๊ตฌ๋ฆฌ๋ ๊ฐ์ ๊ฑด๋๋ค. ๊ฐ์ ๋ช๊ฐ์ unit์ผ๋ก ๋๋์ด์ ธ์๊ณ , ๊ทธ๊ณณ์๋ ๋์ด ์์ ์๋ ์๊ณ ์์์๋ ์๋ค. ๊ฐ๊ตฌ๋ฆฌ๋ ๋ ์์์ ์ ํํ ์ ์์ผ๋ฉฐ ๋ฌผ๋ก ๋ฐ์ด๋ค์ด์ ์๋๋ค.
์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ stones(๋)์ ์์น ๋ฆฌ์คํธ๊ฐ ์ฃผ์ด์ก์ ๋, ๊ฐ๊ตฌ๋ฆฌ๊ฐ ๋ง์ง๋ง ๋์ ์ฐฉ๋ฅํ๋ฉฐ ๊ฐ์ ๊ฑด๋ ์ ์๋์ง ํ๋ณํ๋ผ. ์ฒ์ ๊ฐ๊ตฌ๋ฆฌ๋ ์ฒซ๋ฒ์งธ ๋ ์์ ์ ์์ผ๋ฉฐ, ์ฒซ๋ฒ์งธ ์ ํ๋ 1 unit๋งํผ์ด๋ค.
๋ง์ฝ ๊ฐ๊ตฌ๋ฆฌ์ ๋ง์ง๋ง jump๊ฐ k unit๋งํผ์ด์๋ค๋ฉด, ๋ค์ ์ ํ๋ k-1, k ๋๋ k+1 unit๋งํผ์ด์ด์ผ ํ๋ค. ๊ฐ๊ตฌ๋ฆฌ๋ ์ค์ง ์์ผ๋ก๋ง ๊ฐ ์ ์๋ค.
ํ์ด
public class LeetCode_403_FrogJump {
HashMap<Integer, Integer> m = new HashMap<>();
boolean[][] canGo;
boolean[][] visited;
public boolean canCross(int[] stones) {
if(stones[1] - stones[0] > 1) return false;
for (int i = 0; i < stones.length; i++) {
m.put(stones[i], i);
}
dp = new boolean[stones.length][stones.length];
visited = new boolean[stones.length][stones.length];
return dp(1, 1, stones);
}
private boolean dp(int stone, int jump, int[] stones) {
if (stone == stones.length - 1) return true; // ๋๊น์ง ์๋ค๋ฉด True
if (visited[stone][jump]) return canGo[stone][jump]; // ๋ค๋ฆฐ์ ์ด ์๋ค๋ฉด, ํด๋น ๊ฐ ๊ทธ๋๋ก ์ฌ์ฉ
boolean canJump = false;
for(int j : new int[]{jump - 1, jump, jump + 1}) {
if(j > 0 && m.containsKey(stones[stone] + j)) {
canJump = (canJump || dp(m.get(stones[stone] + j), j, stones));
}
}
visited[stone][jump] = true;
canGo[stone][jump] = canJump;
return canGo[stone][jump];
}
}
m: ๋์ด ์๋ ์์น๋ฅผ ์ฝ๊ฒ ์ธ๋ฑ์ฑ ํ ์ ์๋๋ก ๋ง๋ ๋งต
canGo[i][j]: i ๋ฒ์งธ ๋์์ j ๋งํผ ์ ํํ์ ๋, ๋๊น์ง ๋๋ฌํ ์ ์๋์ง
visited[i][j]: i ๋ฒ์งธ ๋์์ j ๋งํผ ์ ํํ์ ๋๋ฅผ ๊ณ์ฐํ ์ ์ด ์๋์ง
์ ํ ํ ์ ์๋ ๊ฑฐ๋ฆฌ( jump - 1, jump, jump + 1)์ stone์ด ์๋์ง ํ์ธํ๊ณ (containsKey),
๋ง์ฝ ์๋ค๋ฉด, ๊ทธ๊ณณ์ผ๋ก ์ ์งํ๋ค.
๊ณ์ํด์ ์ ์ง์ ํ์ ๋, ์ต์ข ์ ์ผ๋ก stones.length - 1 ์ ๋๋ฌํ๋ค๋ฉด,
๋ง์ง๋ง ๋์ ์์น๊น์ง ๋๋ฌํ์ฌ ๊ฐ์ ๊ฑด๋๊ฒ์ผ๋ก true๋ก ํ์ํ๋ค.
์๊ฐ ๋ณต์ก๋: O(n^2), ๊ณต๊ฐ ๋ณต์ก๋: O(n^2)
https://github.com/jeongum/java-algorithm/blob/master/dynamic_programming/LeetCode_403_FrogJump.java
'๐ ์๊ณ ๋ฆฌ์ฆ > Dynamic Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] Dynamic Programming (0) | 2023.08.05 |
---|---|
[LeetCode] 95. Unique Binary Search Trees II (ํด์, Kotlin/Ja va ํ์ด) (0) | 2023.08.05 |