정수 A를 B로 바꾸려고 한다. 가능한 연산은 다음과 같은 두 가지이다.
A를 B로 바꾸는데 필요한 연산의 최솟값을 구해보자.
첫째 줄에 A, B (1 ≤ A < B ≤ 10^9)가 주어진다.
A를 B로 바꾸는데 필요한 연산의 최솟값에 1을 더한 값을 출력한다. 만들 수 없는 경우에는 -1을 출력한다.
2 162
5
const fs = require('fs');
let n = fs.readFileSync(0, 'utf-8').toString().trim();
let [A, B] = n.trim().split(' ');
let queue = [];
queue.push([A, 0]);
let count = -1;
let calculate = 0;
while (queue.length) {
let number = queue.shift();
if (BigInt(number[0]) === BigInt(B)) {
count = number[1];
break;
}
if (BigInt(number[0]) * 2n <= BigInt(B)) {
calculate = Number(number[0]) * 2;
queue.push([calculate.toString(), number[1] + 1]);
}
if (BigInt(number[0] + 1) <= BigInt(B)) {
calculate = Number(number[0] + 1);
queue.push([calculate.toString(), number[1] + 1]);
}
}
console.log(count !== -1 ? count + 1 : count);
연산 횟수를 줄이려고 계산된 결과들을 담아뒀는데 메모리 초과가 발생했다. 처음에는 B 크기만큼으로 두었는데 생각해보니 B가 10^9까지 가능한 걸 감안하면 말도 안 되는 짓이었다. 그래서 해당 값을 방문하지 않으면 false, 이게 아니고 방문하면 배열에 담는 걸로도 수정했는데 이전보다는 아니였지만 여전히 메모리 초과가 발생했다. 마지막으로 Set으로 수정해줘서 해결했는데, Set에 해당 값을 담아주는 걸 까먹었는데도 정답인 걸 보니 굳이 연산횟수를 줄이려고 하지 않아도 해결되는구나 싶어서 관련 코드는 지웠다. 한 번에 맞출 수 있었는데 아쉽구만.