45. Jump Game II (LeetCode) โ
๐ ๋ฌธ์ ๋งํฌ โ LeetCode 45. Jump Game II
๐งฉ ๋ฌธ์ ์ค๋ช โ
์ ์ ๋ฐฐ์ด nums
๊ฐ ์ฃผ์ด์ง๋๋ค. ๊ฐ ์์ nums[i]
๋ ํ์ฌ ์ธ๋ฑ์ค i
์์ ์ต๋๋ก ์ ํํ ์ ์๋ ๊ฑฐ๋ฆฌ์
๋๋ค. ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค์์ ์์ํด ๋ง์ง๋ง ์ธ๋ฑ์ค์ ๋๋ฌํ๊ธฐ ์ํด ๊ฐ์ฅ ์ ์ ์ ํ ํ์๋ฅผ ๊ตฌํ์ธ์.
- ํญ์ ๋๋ฌํ ์ ์๋ ์ ๋ ฅ๋ง ์ฃผ์ด์ง๋๋ค.
์์ โ
ts
Input: nums = [2, 3, 1, 1, 4]
Output: 2
// ์ฒซ ๋ฒ์งธ ์์น์์ 2์นธ ์ ํ โ ์ธ๋ฑ์ค 1 (๊ฐ 3)
// ์ธ๋ฑ์ค 1์์ 3์นธ ์ ํ โ ์ธ๋ฑ์ค 4 (๋์ฐฉ)
๐ก ์์ด๋์ด โ
์ด ๋ฌธ์ ๋ ์ต์ ์ ํ ํ์๋ฅผ ๊ตฌํ๋ ๊ฒ์ด๋ฏ๋ก, DP (Dynamic Programming) ํน์ Greedy ๋ฐฉ์์ผ๋ก ์ ๊ทผํ ์ ์์ต๋๋ค.
โ ๋ฐฉ๋ฒ 1: Bottom-up DP โ
dp[i]
๋ฅผ ์ธ๋ฑ์คi
์์ ๋๊น์ง ๊ฐ๋ ์ต์ ์ ํ ํ์๋ผ๊ณ ์ ์ํฉ๋๋ค.- ๋ฐฐ์ด์ ๋์์๋ถํฐ ๊ฑฐ๊พธ๋ก ๊ณ์ฐํ๋ฉด์,
i
์์ ๋๋ฌ ๊ฐ๋ฅํ ๋ค์ ์์น๋ค์ ์ต์๊ฐ์ ์ฐธ์กฐํ์ฌdp[i]
๋ฅผ ๊ฐฑ์ ํฉ๋๋ค. - ๋ง์ง๋ง ์ธ๋ฑ์ค๋ ๋๋ฌํ ์ํ์ด๋ฏ๋ก
dp[n-1] = 0
์ผ๋ก ์ด๊ธฐํํฉ๋๋ค.
โ ๋ฐฉ๋ฒ 2: Greedy โ
- ํ์ฌ ํ์ ๊ตฌ๊ฐ ๋ด์์ ๋๋ฌ ๊ฐ๋ฅํ ๊ฐ์ฅ ๋จผ ์์น๋ฅผ ๊ณ์ฐํ๊ณ , ๊ทธ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด ์ ํ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
- ํญ์ ๊ฐ์ฅ ๋ฉ๋ฆฌ ๊ฐ ์ ์๋ ์์น๋ฅผ ํ์ํ๊ธฐ ๋๋ฌธ์ O(n) ์๊ฐ์ ํด๊ฒฐํ ์ ์์ต๋๋ค.
ts
function jump(nums: number[]): number {
let jumps = 0
let currentEnd = 0
let farthest = 0
for (let i = 0; i < nums.length - 1; i++) {
farthest = Math.max(farthest, i + nums[i])
if (i === currentEnd) {
jumps++
currentEnd = farthest
}
}
return jumps
}
โ TypeScript ์ฝ๋ (DP ๋ฐฉ์) โ
ts
function jump(nums: number[]): number {
const n = nums.length
const dp = Array(n).fill(Number.MAX_SAFE_INTEGER)
dp[n - 1] = 0
for (let i = n - 2; i >= 0; i--) {
const maxJump = nums[i]
for (let j = 1; j <= maxJump && i + j < n; j++) {
dp[i] = Math.min(dp[i], dp[i + j] + 1)
}
}
return dp[0]
}
๐ ๏ธ ์ฝ๋ ๋์ ์๋ฆฌ โ
DP ๋ฐฉ์ โ
dp[n-1] = 0
์ผ๋ก ๋ง์ง๋ง ์์น๋ ์ ํ๊ฐ ํ์ ์์์ ์ค์ i
๋ฅผ ๋ฐฐ์ด์ ๋์์๋ถํฐ ์์ํด 0๊น์ง ์ด๋- ๊ฐ ์์น์์ ์ ํ ๊ฐ๋ฅํ ๊ฑฐ๋ฆฌ(
nums[i]
)๋งํผ ๋ค์ ์์น๋ค์ ํ์ - ๋๋ฌ ๊ฐ๋ฅํ ๋ค์ ์์น๋ค์
dp
๊ฐ ์ค ์ต์์ +1 ํ์ฌdp[i]
๊ฐฑ์ dp[0]
์ ์ต์ ์ ํ ํ์๊ฐ ์ ์ฅ๋์ด ๋ฐํ
Greedy ๋ฐฉ์ โ
i
๋ฅผ 0๋ถํฐ ๋๊น์ง ์ํํ๋ฉด์i + nums[i]
๋ก ๊ฐ์ฅ ๋ฉ๋ฆฌ ๊ฐ ์ ์๋ ์ง์ (farthest
) ๊ฐฑ์- ํ์ฌ ํ์ ๋ฒ์๊ฐ ๋๋๋ ์ง์ (
currentEnd
)์ ๋๋ฌํ๋ฉด ์ ํ ์ ์ฆ๊ฐ ํ, ํ์ ๋ฒ์๋ฅผfarthest
๋ก ๊ฐฑ์ - ๋ง์ง๋ง ์ธ๋ฑ์ค๋ฅผ ํฌํจํ ๋๊น์ง ๋ฐ๋ณต
๐ ์๊ฐ ๋ณต์ก๋ & ๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์ โ
๋ฐฉ์ | ์๊ฐ ๋ณต์ก๋ | ๊ณต๊ฐ ๋ณต์ก๋ |
---|---|---|
DP | O(n^2) | O(n) |
Greedy | O(n) | O(1) |
๐ ๋ค๋ฅธ ํ์ด ๋ฐฉ๋ฒ๊ณผ ๋น๊ต โ
- Greedy ๋ฐฉ๋ฒ: ๋งค๋ฒ ๋๋ฌํ ์ ์๋ ์ต๋ ๋ฒ์๋ฅผ ์ ๋ฐ์ดํธํ๋ฉด์ ์ ํ ํ์๋ฅผ ์ธ๋ ๋ฐฉ์. ์๊ฐ ๋ณต์ก๋ O(n) ์ผ๋ก ๊ฐ์ฅ ํจ์จ์ ์ ๋๋ค.
- DP ๋ฐฉ๋ฒ: ์ง๊ด์ ์ด๋ฉฐ ๊ตฌ์กฐํ๋ ์ ๊ทผ์ด์ง๋ง, ๋นํจ์จ์ ์ธ ์ค๋ณต ๊ณ์ฐ์ด ๋ฐ์ํ ์ ์์ด ์๋ ๋ฉด์์ ๋ถ๋ฆฌํฉ๋๋ค.
๐ ํต์ฌ ๋ด์ฉ ์์ฝ โ
- ๋ฌธ์ ์ ํ: ์ต์ ํ์๋ก ๋๋ฌํ๋ ๊ฒฝ๋ก โ ์ต์ ํ ๋ฌธ์ โ DP ๋๋ Greedy
- DP ๋ฐฉ์:
dp[i]
= i์์ ๋๊น์ง ๊ฐ๋ ์ต์ ์ ํ ์ - Greedy ๋ฐฉ์: ๋งค ํ์ ๊ตฌ๊ฐ๋ง๋ค ๊ฐ์ฅ ๋ฉ๋ฆฌ ๋๋ฌ ๊ฐ๋ฅํ ์์น๋ฅผ ์ ํ
- ํจ์จ์ฑ ๋ฉด์์๋ Greedy ๋ฐฉ์์ด ์ต์ (O(n))