Skip to content

Jump Game IIΒ #57

@hsskey

Description

@hsskey

문제 μ„€λͺ… | Jump Game II

μ •μˆ˜ λ°°μ—΄ numsκ°€ μ£Όμ–΄μ§ˆ λ•Œ, μ‹œμž‘μ (인덱슀 0)μ—μ„œ λ§ˆμ§€λ§‰ 인덱슀(nums[n-1])κΉŒμ§€ λ„λ‹¬ν•˜κΈ° μœ„ν•œ μ΅œμ†Œ 점프 횟수λ₯Ό κ΅¬ν•˜λŠ” 문제. 각 μœ„μΉ˜ iμ—μ„œλŠ” μ΅œλŒ€ nums[i]만큼 μ•žμœΌλ‘œ 점프할 수 μžˆλ‹€.

πŸ“ μ œμ•½μ‘°κ±΄

  • 1 <= nums.length <= 10^4
  • 0 <= nums[i] <= 1000
  • 항상 λ§ˆμ§€λ§‰ μΈλ±μŠ€μ— 도달할 수 μžˆλ‹€κ³  보μž₯됨

πŸ’‘ μ˜ˆμ‹œ

  • Input: nums = [2,3,1,1,4]

    • Output: 2
    • μ„€λͺ…: 인덱슀 0μ—μ„œ 1둜 1번 점프, 인덱슀 1μ—μ„œ λ§ˆμ§€λ§‰ 인덱슀둜 1번 점프, 총 2번
  • Input: nums = [2,3,0,1,4]

    • Output: 2

문제 ν•΄κ²° κ³Όμ •

Step 1: 문제 μ΄ν•΄ν•˜κΈ°

  • μž‘μ€ μ˜ˆμ‹œλ‘œ 직접 풀어보기:
    • [2,3,1,1,4]μ—μ„œ:
      • 인덱슀 0μ—μ„œλŠ” 1μΉΈ λ˜λŠ” 2μΉΈ 점프 κ°€λŠ₯ β†’ 인덱슀 1 λ˜λŠ” 2둜 이동 κ°€λŠ₯
      • 인덱슀 1μ—μ„œλŠ” μ΅œλŒ€ 3μΉΈ 점프 κ°€λŠ₯ β†’ 인덱슀 2, 3, 4둜 이동 κ°€λŠ₯
      • λ”°λΌμ„œ 0 β†’ 1 β†’ 4둜 μ΄λ™ν•˜λ©΄ 2번의 μ ν”„λ‘œ 도착 κ°€λŠ₯

Step 2: μ ‘κ·Ό 방법

  • μ§κ΄€μ μœΌλ‘œ μƒκ°ν•˜κΈ°

    • 그리디(Greedy) 접근법: 각 μ§€μ μ—μ„œ κ°€μž₯ 효율적인 점프λ₯Ό 선택
    • BFS(Breadth-First Search)와 μœ μ‚¬ν•œ λ ˆλ²¨λ³„ νƒμƒ‰μœΌλ‘œ 생각할 수 있음
  • μ•Œκ³ λ¦¬μ¦˜ ν‘œ μž‘μ„±

    초기 μƒνƒœ: result = 0, left = 0, right = 0 (ν˜„μž¬ μœ„μΉ˜ λ²”μœ„)
    ↓
    ν˜„μž¬ λ²”μœ„(left ~ right)μ—μ„œ 도달 κ°€λŠ₯ν•œ κ°€μž₯ λ¨Ό μœ„μΉ˜ μ°ΎκΈ°
    ↓
    λ‹€μŒ λ²”μœ„ μ—…λ°μ΄νŠΈ: left = right + 1, right = μ΅œλŒ€λ„λ‹¬κ±°λ¦¬
    ↓
    점프 횟수(result) 증가
    ↓
    λ§ˆμ§€λ§‰ μΈλ±μŠ€μ— 도달할 λ•ŒκΉŒμ§€ 반볡
    
  • μ‹œκ°„ λ³΅μž‘λ„ κ³ λ €

    • 각 μœ„μΉ˜λ₯Ό μ΅œλŒ€ ν•œ λ²ˆμ”©λ§Œ λ°©λ¬Έ: O(n)

Step 3: μ½”λ“œ 섀계

  1. κ²°κ³Ό λ³€μˆ˜(result), ν˜„μž¬ λ²”μœ„μ˜ μ‹œμž‘(left)κ³Ό 끝(right) μ΄ˆκΈ°ν™”
  2. rightκ°€ λ§ˆμ§€λ§‰ μΈλ±μŠ€λ³΄λ‹€ μž‘μ€ λ™μ•ˆ 반볡:
    • ν˜„μž¬ λ²”μœ„(left~right)μ—μ„œ 도달 κ°€λŠ₯ν•œ κ°€μž₯ λ¨Ό μœ„μΉ˜(farthest) 계산
    • λ‹€μŒ λ²”μœ„ μ—…λ°μ΄νŠΈ(left = right + 1, right = farthest)
    • 점프 횟수(result) 증가
  3. μ΅œμ’… 점프 횟수 λ°˜ν™˜

Step 4: μ½”λ“œ κ΅¬ν˜„ 및 뢄석

var jump = function(nums) {
    let result = 0
    let left = 0
    let right = 0

    while(right < nums.length - 1) {
        let farthest = 0
        for(let i = left; i <= right; i++) {
            farthest = Math.max(farthest, i + nums[i])
        }
        left = right + 1
        right = farthest
        result += 1
    }
    return result
};

console.log(jump([2,3,1,1,4]))
console.log(jump([2,3,0,1,4]))

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions