풀이과정
정답은 맞췄지만 개선이 필요함을 느낌
문제 자체는 dp를 이용하면 크게 어렵지 않았는데, N
으로 부터 1
로 가는 과정에서 i
를 만드는데 필요한 연산횟수인 dp[i]
를 구하기 위해서는 i+1
과 2*i
, 3*i
번째 값들의 최소값을 가져와야 했다.
그래서 Math.min(dp[i + 1], dp[2 * i], dp[3 * i])
라는 연산이 필요한데, dp
배열의 원소의 개수를 N개로 설정할 경우 i+1
, 2*i
, 3*i
가 undefined
이기 때문에 NaN
이 리턴된다. 그래서 dp
배열의 범위를 3*N + 1
로 설정해 문제를 해결하긴 했는데, 이건 또 너무 메모리 낭비가 될 것 같았다.
개선방법
결국 아래의 부분에서 Math.min 메소드
의 인자로 undefined
가 들어가기 때문에 문제인 건데,
for (let i = N - 1; i >= 1; i--) {
dp[i] = 1 + Math.min(dp[i + 1], dp[2 * i], dp[3 * i]);
}
이 부분을 아래처럼 개선할 수 있었다.
for (let i = N - 1; i >= 1; i--) {
const filtered = [dp[i + 1], dp[2 * i], dp[3 * i]].filter(v => v !== undefined);
dp[i] = 1 + Math.min(...filtered);
}
이렇게 되면 최초에 dp
배열을 초기화할 때 N+1
범위까지만 설정하더라도 오류가 생기지 않는다.
정답코드
const filePath = process.platform === 'linux' ? 'dev/stdin' : './input.txt';
const input = require('fs').readFileSync(filePath).toString();
const N = Number(input);
const dp = [...Array(3 * N + 1)].map(v => 1000000);
dp[N] = 0;
for (let i = N - 1; i >= 1; i--) {
dp[i] = 1 + Math.min(dp[i + 1], dp[2 * i], dp[3 * i]);
}
console.log(dp[1]);
'알고리즘 문제풀이' 카테고리의 다른 글
백준 - 1406 에디터 (1) | 2023.11.24 |
---|---|
백준 - 1912 연속합(Javascript) (1) | 2023.11.21 |
백준 silver 4 - 2839 설탕 배달(Javascript) (1) | 2023.11.20 |
프로그래머스 level 2 - 숫자 변환하기(Javascript) (0) | 2023.11.15 |
프로그래머스 level 2 - 뒤에 있는 큰 수 찾기(Javascript) (0) | 2023.11.15 |