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

LeetCode 279 - Perfect Squares (Medium)

by HandHand 2021. 3. 3.

문제

LeetCode - 279번

풀이 κ³Όμ •

μ–‘μ˜ μ •μˆ˜ n 에 λŒ€ν•΄μ„œ μ΅œμ†Œ 개수의 μ™„μ „ 제곱수둜 ν‘œν˜„ν•˜λŠ” 방법을 μ°ΎλŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ 12 λŠ” 2의 제곱인 4 λ₯Ό 3번 λ”ν•΄μ„œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

λ§Œμ•½ κ΅¬ν•˜κ³ μž ν•˜λŠ” 수 n 을 μ΄μš©ν•΄μ„œ dp(n) = n을 μ™„μ „ 제곱수둜 ν‘œν˜„ν•˜κΈ° μœ„ν•œ μ΅œμ†Œ 개수 라고 ν•œλ‹€λ©΄
λ‹€μŒκ³Ό 같은 점화식을 μ„ΈμšΈ 수 μžˆμŠ΅λ‹ˆλ‹€.

dp(n) = min(dp(n-X)+1), μ΄λ•Œ X λŠ” n을 λ„˜κΈ°μ§€ μ•ŠλŠ” μ™Όμ „ 제곱 수


예λ₯Ό λ“€μ–΄ `dp(13)` 은 9λ₯Ό μ™„μ „ 제곱수둜 1개 μ„ νƒν•˜κ³  `dp(13-9) + 1 = dp(4) + 1` κ³Ό 같이 ν‘œν˜„ν•  수 μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€.
λ”°λΌμ„œ μœ„μ™€ 같이 점화식을 μ„Έμ›Œμ£Όλ©΄ `동적 κ³„νšλ²•` 으둜 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ½”λ“œ

/**
 * @param {number} n
 * @return {number}
 */
var numSquares = function (n) {
  const dp = new Array(n + 1).fill(Infinity);

  dp[0] = 0;

  for (let i = 1; i <= n; i++) {
    let p = 1;
    while (p ** 2 <= i) {
      dp[i] = Math.min(dp[i], dp[i - p ** 2] + 1);
      p += 1;
    }
  }

  return dp[n];
};
λ°˜μ‘ν˜•

πŸ’¬ λŒ“κΈ€