-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path1463.js
29 lines (23 loc) · 1.33 KB
/
1463.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//기능 3가지를 최소 횟수로 사용해서 정수 N을 1로 만들기
const input = require('fs').readFileSync('/dev/stdin')
const N = Number(input);
//DP배열의 index는 숫자를 뜻하고, 각 숫자에 최솟값을 집어넣음??
//연산한 값을 저장해놓고 가져와서 사용하기 위해서 array를 만든다.
const DP = new Array(N + 1).fill(0);
//1일 때는 결과가 0이다. DP[1]도 0이다.
for (let i = 2; i <= N; i++) {
//1을 빼서 답을 구할 경우의 수 / 1을 빼기 때문에 매번 경우의 수가 1씩 있고 이전보다 한번씩 더 빼야해서 이전 값에 +1 한다.
//한번 시도해본 것이기 때문에 값들에 + 1 이 들어가는 것이다.
DP[i] = DP[i - 1] + 1;
//i/2번방의 숫자에 1을 더하고, 그 값을 비교해서 작은 값을 다시 dp[i]에 넣는다.
//중요**이전 i값에서 계산된 숫자는 이미 남아있다.** (이해안되면 하나씩 손으로 써보면 이해됨)
if (i % 2 === 0) {
DP[i] = Math.min(DP[i], DP[i / 2] + 1);
}
//i가 6일 경우 DP[i]는 위 -1이 되고 %2도 된 3에 누적된 값에 +1을한 값과 비교되어 들어간다.
//중요**이전 i값에서 계산된 숫자는 이미 남아있다.**
if (i % 3 === 0) {
DP[i] = Math.min(DP[i], DP[i / 3] + 1);
}
}
console.log(DP[N]);