백준 SILVER 1(1로 만들기 2) - #12852
-
사용 언어 : javascript
-
해결 날짜 : 2023-02-11
-
해결 방법 :
- dp를 활용해 문제 해결
- dp 별 1번 인덱스: 연산의 최솟값, 2번 인덱스: 경로
- dp의 각 값을 1뺀 경우, 2로 나누는 경우, 3으로 나누는 경우 중 최솟값으로 업데이트
-
회고 :
- x
-
코드
const fs = require('fs'); const filePath = process.platform === 'linux' ? '/dev/stdin' : '../input.txt'; const input = fs.readFileSync(filePath).toString().trim(); solution(input); function solution(props) { const N = +props; const dp = Array.from({ length: N + 1 }, (_, i) => [0, i === 1 ? [1] : []]); for (let i = 2; i <= N; i++) { dp[i][0] = dp[i - 1][0] + 1; dp[i][1] = [...dp[i - 1][1], i]; if (i % 3 === 0 && dp[Math.floor(i / 3)][0] + 1 < dp[i][0]) { dp[i][0] = dp[Math.floor(i / 3)][0] + 1; dp[i][1] = [...dp[Math.floor(i / 3)][1], i]; } if (i % 2 == 0 && dp[Math.floor(i / 2)][0] + 1 < dp[i][0]) { dp[i][0] = dp[Math.floor(i / 2)][0] + 1; dp[i][1] = [...dp[Math.floor(i / 2)][1], i]; } } console.log(`${dp[N][0]}\n${dp[N][1].reverse().join(' ')}`); }
-
출처: 백준