Skip to content

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 ๋ฐฉ์‹ โ€‹

  1. dp[n-1] = 0์œผ๋กœ ๋งˆ์ง€๋ง‰ ์œ„์น˜๋Š” ์ ํ”„๊ฐ€ ํ•„์š” ์—†์Œ์„ ์„ค์ •
  2. i๋ฅผ ๋ฐฐ์—ด์˜ ๋์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด 0๊นŒ์ง€ ์ด๋™
  3. ๊ฐ ์œ„์น˜์—์„œ ์ ํ”„ ๊ฐ€๋Šฅํ•œ ๊ฑฐ๋ฆฌ(nums[i])๋งŒํผ ๋‹ค์Œ ์œ„์น˜๋“ค์„ ํƒ์ƒ‰
  4. ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ๋‹ค์Œ ์œ„์น˜๋“ค์˜ dp๊ฐ’ ์ค‘ ์ตœ์†Œ์— +1 ํ•˜์—ฌ dp[i] ๊ฐฑ์‹ 
  5. dp[0]์— ์ตœ์†Œ ์ ํ”„ ํšŸ์ˆ˜๊ฐ€ ์ €์žฅ๋˜์–ด ๋ฐ˜ํ™˜

Greedy ๋ฐฉ์‹ โ€‹

  1. i๋ฅผ 0๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ˆœํšŒํ•˜๋ฉด์„œ i + nums[i]๋กœ ๊ฐ€์žฅ ๋ฉ€๋ฆฌ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ง€์ (farthest) ๊ฐฑ์‹ 
  2. ํ˜„์žฌ ํƒ์ƒ‰ ๋ฒ”์œ„๊ฐ€ ๋๋‚˜๋Š” ์ง€์ (currentEnd)์— ๋„๋‹ฌํ•˜๋ฉด ์ ํ”„ ์ˆ˜ ์ฆ๊ฐ€ ํ›„, ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ farthest๋กœ ๊ฐฑ์‹ 
  3. ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๋ฅผ ํฌํ•จํ•  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต

๐Ÿ“Š ์‹œ๊ฐ„ ๋ณต์žก๋„ & ๊ณต๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„ โ€‹

๋ฐฉ์‹์‹œ๊ฐ„ ๋ณต์žก๋„๊ณต๊ฐ„ ๋ณต์žก๋„
DPO(n^2)O(n)
GreedyO(n)O(1)

๐Ÿ”„ ๋‹ค๋ฅธ ํ’€์ด ๋ฐฉ๋ฒ•๊ณผ ๋น„๊ต โ€‹

  • Greedy ๋ฐฉ๋ฒ•: ๋งค๋ฒˆ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฒ”์œ„๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉด์„œ ์ ํ”„ ํšŸ์ˆ˜๋ฅผ ์„ธ๋Š” ๋ฐฉ์‹. ์‹œ๊ฐ„ ๋ณต์žก๋„ O(n) ์œผ๋กœ ๊ฐ€์žฅ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
  • DP ๋ฐฉ๋ฒ•: ์ง๊ด€์ ์ด๋ฉฐ ๊ตฌ์กฐํ™”๋œ ์ ‘๊ทผ์ด์ง€๋งŒ, ๋น„ํšจ์œจ์ ์ธ ์ค‘๋ณต ๊ณ„์‚ฐ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด ์†๋„ ๋ฉด์—์„œ ๋ถˆ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ ํ•ต์‹ฌ ๋‚ด์šฉ ์š”์•ฝ โ€‹

  • ๋ฌธ์ œ ์œ ํ˜•: ์ตœ์†Œ ํšŸ์ˆ˜๋กœ ๋„๋‹ฌํ•˜๋Š” ๊ฒฝ๋กœ โ†’ ์ตœ์ ํ™” ๋ฌธ์ œ โ†’ DP ๋˜๋Š” Greedy
  • DP ๋ฐฉ์‹: dp[i] = i์—์„œ ๋๊นŒ์ง€ ๊ฐ€๋Š” ์ตœ์†Œ ์ ํ”„ ์ˆ˜
  • Greedy ๋ฐฉ์‹: ๋งค ํƒ์ƒ‰ ๊ตฌ๊ฐ„๋งˆ๋‹ค ๊ฐ€์žฅ ๋ฉ€๋ฆฌ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ์œ„์น˜๋ฅผ ์„ ํƒ
  • ํšจ์œจ์„ฑ ๋ฉด์—์„œ๋Š” Greedy ๋ฐฉ์‹์ด ์ตœ์  (O(n))