45. Jump Game II

  • μ²˜μŒμ—λŠ” Jump Gameμ—μ„œ ν’€μ—ˆλ˜ 방식을 μ΄μš©ν•˜μ—¬ μ‹œλ„ν•˜μ˜€μœΌλ‚˜ μ‹€νŒ¨ν–ˆλ‹€.
    • μ΅œλŒ€λ‘œ 점프 κ°€λŠ₯ν•œ 길이 maxJump λ₯Ό κ΅¬ν•˜κ³ 
    • λ§Œμ•½μ— ν˜„μž¬ 점프 길이가 maxJump 보닀 크면 값을 ꡐ체 + μ ν”„ν•œ 횟수 jumpCount λ₯Ό μ¦κ°€μ‹œν‚¨λ‹€.
    • μ΄λ ‡κ²Œ ν’€λ©΄ 도달 κ°€λŠ₯ν•œ 경우의 μˆ˜μ— λŒ€ν•œ jumpCountλ₯Ό ꡬ할 순 μžˆμ§€λ§Œ μ΅œμ†Œ 점프 νšŸμˆ˜κ°€ μ•„λ‹Œ κ²½μš°κ°€ 생길 수 μžˆλ‹€.
      • 예: [7,100,1] 의 경우 ν•œ λ²ˆμ— 점프 κ°€λŠ₯ν•˜μ§€λ§Œ μœ„μ˜ λ‘œμ§μ— μ˜ν•˜λ©΄ μ ν”„ν•œ νšŸμˆ˜κ°€ 2νšŒκ°€ λœλ‹€.
  • λ‘λ²ˆμ§Έ μ‹œλ„μ—μ„œλŠ” μ•„λž˜μ™€ 같은 방법을 μ‚¬μš©ν–ˆλ‹€.
    • (1) ν˜„μž¬ μœ„μΉ˜ currPosλ₯Ό λ§ˆμ§€λ§‰ μœ„μΉ˜ nums.size() - 1 둜 μ§€μ •ν•œλ‹€.
    • (2) currPos에 도달 κ°€λŠ₯ν•œ κ°€μž₯ λ¨Ό μœ„μΉ˜ nextPosλ₯Ό μ°ΎλŠ”λ‹€.
      • currPos - 1 λΆ€ν„° μ—­μˆœμœΌλ‘œ μ°ΎλŠ”λ‹€.
      • μ ν”„μ˜ 길이 nums[pos]κ°€ ν˜„μž¬ μœ„μΉ˜κΉŒμ§€μ˜ 거리 currPos - pos 보닀 컀야 ν•œλ‹€.
    • (3) nextPosλ₯Ό μ°Ύμ•˜λ‹€λ©΄ 점프 횟수 jumpCountλ₯Ό μ¦κ°€μ‹œν‚€κ³  ν˜„μž¬ μœ„μΉ˜λ₯Ό λ‹€μŒ μœ„μΉ˜λ‘œ μ΄λ™μ‹œν‚¨λ‹€ currPos = nextPos.
    • (4) μ‹œμž‘μ  0에 도달할 λ•Œ κΉŒμ§€ (2)~(3)을 λ°˜λ³΅ν•œλ‹€.
  • λ§Œμ•½μ— array의 길이가 μ§§μ•˜λ‹€λ©΄ BFS + memoization을 μ‚¬μš©ν•΄μ„œ ν’€μ—ˆμ„ 것 κ°™λ‹€.
class Solution { public: int jump(vector<int>& nums) { int jumpCount = 0; int currPos = nums.size() - 1; while (currPos > 0) { int nextPos = -1; for (int pos = currPos - 1; pos >= 0; --pos) { if (nums[pos] >= currPos - pos) { nextPos = pos; } } if (nextPos == -1) return -1; currPos = nextPos; ++jumpCount; } return jumpCount; } };