반복문

function run(inputs: string) {
  const n = Number(inputs);
  const dp = Array(n + 1).fill(-1);

  for (let i = 1; i <= n; i++) {
    dp[i] = dp[i - 1] + 1;

    if (i % 3 === 0) dp[i] = Math.min(dp[i], dp[i / 3] + 1);
    if (i % 2 === 0) dp[i] = Math.min(dp[i], dp[i / 2] + 1);
  }

  return dp[n];
}

재귀

function run(inputs: string) {
  const number = Number(inputs);
  const memo = Array(number + 1).fill(-1);

  function go(num: number): number {
    if (num === 1) return 0;
    if (memo[num] !== -1) return memo[num];

    let result = go(num - 1) + 1;

    if (num % 3 === 0) result = Math.min(result, go(num / 3) + 1);
    if (num % 2 === 0) result = Math.min(result, go(num / 2) + 1);

    memo[num] = result;
    return memo[num];
  }
  return go(number);
}

반복문을 사용한 동적 계획법(DP)의 장점