https://www.acmicpc.net/problem/1463
1463번: 1로 만들기
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
www.acmicpc.net
// const input = require("fs").readFileSync("/dev/stdin").toString().trim().split("\n");
let input = require("fs")
.readFileSync("example.txt")
.toString()
.trim()
.split("\r\n");
let x = parseInt(input.shift());
const dp = new Array(x + 1).fill(0);
for (let i = 2; i <= x; 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);
}
}
console.log(dp[x]);
숫자가 커질수록 작은 숫자에 의존하는 dp성 문제이다.
예를 들어 4의 경우는 (3에서 1로가는 경우의수 + 4가 3으로 가는 경우의 수)이다.
따라서 나눴을 경우와 그냥 이전의 숫자에 의존하는 경우를 비교하여 작은 경우의 수로 채워 넣으면 된다.
'코딩테스트 연습' 카테고리의 다른 글
[백준] 2606번 바이러스(JavaScript) (0) | 2024.01.17 |
---|---|
[백준] 1929번 소수 구하기 (JavaScript) (0) | 2024.01.16 |
[백준] 1260번 DFS와 BFS (JavaScript) (0) | 2024.01.16 |
[Softeer] 회의실 예약 (0) | 2023.09.21 |
[Softeer] 금고털이 (0) | 2023.09.20 |