λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸƒ algorithm/leetcode

LeetCode 55 - Jump Game (Medium)

by HandHand 2021. 3. 2.

문제

LeetCode - 55번

풀이 κ³Όμ •

ν˜„μž¬ μœ„μΉ˜μ—μ„œ 움직일 수 μžˆλŠ” 거리가 μ£Όμ–΄μ Έμžˆκ³ , 이λ₯Ό 톡해 λ§ˆμ§€λ§‰ μœ„μΉ˜ 도달 κ°€λŠ₯성을 νŒλ‹¨ν•˜λŠ” 동적 κ³„νšλ²• λ¬Έμ œμž…λ‹ˆλ‹€.
λ”°λΌμ„œ dp(x) = xμ—μ„œ λ§ˆμ§€λ§‰ index에 도달 κ°€λŠ₯ν•œμ§€ μ—¬λΆ€ 라고 μ •μ˜ν•œλ‹€λ©΄ λ‹€μŒκ³Ό 같은 점화식을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

dp(x) = at least one for all dp(x + jump) , μ΄λ•Œ jumpλŠ” xμ—μ„œ 점프 κ°€λŠ₯ν•œ 거리


즉, ν˜„μž¬ μœ„μΉ˜μ—μ„œ 도달 κ°€λŠ₯ν•œ μœ„μΉ˜ 쀑 μ–΄λŠ ν•˜λ‚˜λΌλ„ λ§ˆμ§€λ§‰ μœ„μΉ˜μ— λ„λ‹¬ν•˜λŠ” 경둜λ₯Ό 가지고 μžˆλ‹€λ©΄
ν˜„μž¬ μœ„μΉ˜μ—μ„œλ„ λ§ˆμ§€λ§‰μ— 도달할 수 μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€.

Javascript μ—μ„œλŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° 기법에 κΈ°λ°˜ν•œ λ©”λͺ¨μ΄μ œμ΄μ…˜ νŒ¨ν„΄μ΄ μžˆμŠ΅λ‹ˆλ‹€.
이번 λ¬Έμ œμ—μ„œλŠ” ν΄λ‘œμ € λ₯Ό ν™œμš©ν•΄μ„œ Top-down λ°©μ‹μ˜ λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ κ΅¬ν˜„ν•΄λ΄€μŠ΅λ‹ˆλ‹€.

λ‹€λ₯Έ μ‚¬λžŒλ“€μ˜ 풀이λ₯Ό λ³΄λ‹ˆ 미리 κ³ μ •λœ Array λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ Map 자료ꡬ쑰λ₯Ό ν™œμš©ν•˜λŠ” 방법도 μ œμ‹œλ˜κ³  μžˆλŠ”λ°
그쀑 κ°€μž₯ 일반적으둜 μ‚¬μš©ν•˜λŠ” 방식(Object μ‚¬μš©)을 μ μš©ν–ˆμŠ΅λ‹ˆλ‹€.

μ½”λ“œ

/**
 * @param {number[]} nums
 * @return {boolean}
 */

var canJump = function (nums) {
  let cache = {};
  const dp = function (x) {
    if (x >= nums.length) {
      return 0;
    } else if (x === nums.length - 1) {
      return 1;
    }

    if (x in cache) {
      return cache[x];
    }

    cache[x] = false;
    for (let jump = 1; jump <= nums[x]; jump++) {
      cache[x] |= dp(x + jump) ? 1 : 0;
    }

    return cache[x];
  };

  return dp(0);
};

const nums = [2, 0];
console.log(canJump(nums));

Javascript λ©”λͺ¨μ΄μ œμ΄μ…˜ 참고자료

λ°˜μ‘ν˜•

'πŸƒ algorithm > leetcode' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

LeetCode 49 - Group Anagrams (Medium)  (0) 2021.03.02
LeetCode 200 - Number of Islands (Medium)  (0) 2021.03.02
LeetCode 64 - Minimum Path Sum (Medium)  (0) 2021.03.02
LeetCode 70 - Climing Stairs (Easy)  (0) 2021.03.02
LeetCode 1 - Two Sum (Easy)  (0) 2021.03.02

πŸ’¬ λŒ“κΈ€