Problem
자연수 x를 y로 변환하려고 합니다. 사용할 수 있는 연산은 다음과 같습니다.
x에 n을 더합니다
x에 2를 곱합니다.
x에 3을 곱합니다.
자연수 x, y, n이 매개변수로 주어질 때, x를 y로 변환하기 위해 필요한 최소 연산 횟수를 return하도록 solution 함수를 완성해주세요. 이때 x를 y로 만들 수 없다면 -1을 return 해주세요.
Solution
function solution(x, y, n) {
if (x === y) return 0;
let answer = 1000000;
function dfs (num, count) {
if(num === x) {
answer = Math.min(answer, count);
return;
} else if (num < x) return;
if(num % 3 === 0) dfs(num / 3, count + 1);
if(num % 2 === 0) dfs(num / 2, count + 1);
dfs(num - n, count + 1);
};
dfs(y, 0);
return answer === 1000000 ? -1 : answer;
}
dfs가 떠올라서 풀었더니 효율성 시간 초과났다..😿
시간 초과 줄이는 방법을 고민하다가 답이 안 나와서 다른 사람의 코드를 확인해보니 dp를 이용하였다.
function solution(x, y, n) {
if(x === y) return 0;
const dp = new Array(y + 1).fill(1000000);
dp[x] = 0;
for(let i = x + 1; i < y + 1; i++){
if(x <= i - n) dp[i] = Math.min(dp[i], dp[i - n] + 1);
if(i % 2 === 0 && x <= i / 2) dp[i] = Math.min(dp[i], dp[i / 2] + 1);
if(i % 3 === 0 && x <= i / 3) dp[i] = Math.min(dp[i], dp[i / 3] + 1);
}
return dp[y] === 1000000 ? -1 : dp[y];
}
'프로그래머스 (JS) > Lv. 2' 카테고리의 다른 글
[Programmers / JS] 86971번 - 전력망을 둘로 나누기 (0) | 2023.06.15 |
---|---|
[Programmers / JS] 77885번 - 2개 이하로 다른 비트 (0) | 2023.05.25 |
[Programmers / JS] 154539번 - 뒤에 있는 큰 수 찾기 (0) | 2023.05.24 |
[Programmers / JS] 42583번 - 다리를 지나는 트럭 (0) | 2023.05.15 |
[Programmers / JS] 12913번 - 땅따먹기 (0) | 2023.05.07 |