본문 바로가기
코딩테스트 연습/DP

[백준] 1463번 1로 만들기 (JavaScript)

by eddypark 2024. 4. 30.

https://www.acmicpc.net/problem/1463

const input = require('fs')
  .readFileSync(process.platform === 'linux' ? '/dev/stdin' : './input.txt')
  .toString()
  .trim()
  .split('\n')
  .map(Number);

let N = input[0];
let answer = ['', 0, 1, 1];
for (let i = 4; i <= N; i++) {
  if (i % 3 === 0 && i % 2 === 0) {
    answer[i] = Math.min(answer[i - 1], answer[i / 2], answer[i / 3]) + 1;
  } else if (i % 3 === 0) {
    answer[i] = Math.min(answer[i - 1], answer[i / 3]) + 1;
  } else if (i % 2 === 0) {
    answer[i] = Math.min(answer[i - 1], answer[i / 2]) + 1;
  } else {
    answer[i] = answer[i - 1] + 1;
  }
}

console.log(answer[N]);

 

계산이 되는 앞 단계의 최소 횟수에서 +1 하면 답이다. 

3과 2로 모두 나눠지는 경우 3으로 나눴을 때와 2로 나눴을 때의 계산 횟수 중 최솟값에서 + 1을 하면된다.

ex) 6인 경우 둘 다 나눠지기 때문에 3인 경우 + 1 과 2인 경우 + 1을 비교하여 작은 값에 +1