14631にする👊


質問する


整数Xに使用できる演算は3種類あります.
1.Xを3で割って、3で割った.
2.Xを2で割り、2で割ります.
1を減らす.
整数Nが与えられると、上記3つの演算を適宜用いて1が作成される.使用演算回数の最大値を出力してください.

入力


第1行は、1以上、10^6以下の整数Nを与える.

しゅつりょく


1行目の演算回数の最大値を出力します.

入力例1


2

サンプル出力1


1

入力例2


10

サンプル出力2


3

コード#コード#


✔以前に求めた値を配列に格納し続け、+1で求める.
const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

rl.on("line", function (line) {
  const num = Number(line); // 배열 크기를 만들기 위해 입력 받은 값 숫자로 형변환
  const arr = new Array(num + 1).fill(0); // 입력받은 크기만큼 배열 공간 만들고 0으로 초기화

  for (let i = 2; i <= num; i++) {
    arr[i] = arr[i - 1] + 1; // arr[2]에 1대입

    if (i % 2 === 0) {
      // i가 2로 나누어 떨어지면
      arr[i] = Math.min(arr[i], arr[i / 2] + 1); // 위에서 대입한  1(arr[i])과 0(arr[2/2]+1)을 비교해서 작은 값을 arr[2]에 대입
    }

    if (i % 3 === 0) {
      // i가 3으로 나누어 떨어지면
      arr[i] = Math.min(arr[i], arr[i / 3] + 1); // 위의 코드와 마찬가지 (3으로 나누어졌던 과거 숫자들을 찾아야되므로 i/3)
    }
  }
  console.log(arr[num]);
}).on("close", function () {
  process.exit();
});