[LeetCode] 403. Frog Jump (ν΄μ, Java νμ΄)
λ¬Έμ
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