문제 설명[링크]

풀이 1(bfs)
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
let [N, K] = input[0].split(' ').map(Number);
const visit = (pos, queue, visited) => {
  visited[pos] = true;
  queue.push(pos);
};
if (N >= K) {
  console.log(N - K);
} else {
  const maxSize = K * 2 + 1;
  const visited = new Array(maxSize).fill(false);
  let result = 0;
  let queue = [N];
  visited[N] = true;
  while (queue.length) {
    const newQueue = [];
    let isBreak = false;
    for (const pos of queue) {
      if (pos === K) {
        isBreak = true;
        break;
      }
      if (pos !== 0) {
        let posCache = pos * 2;
        while (posCache < maxSize) {
          if (!visited[posCache]) {
            visit(posCache, queue, visited);
          }
          posCache *= 2;
        }
      }
    }
    for (const pos of queue) {
      if (pos + 1 < maxSize && !visited[pos + 1]) {
        visit(pos + 1, newQueue, visited);
      }
      if (pos - 1 >= 0 && !visited[pos - 1]) {
        visit(pos - 1, newQueue, visited);
      }
    }
    if (isBreak) break;
    result += 1;
    queue = newQueue;
  }
  console.log(result);
}
결과 1

풀이 2(bitmasking)
const fs = require('fs');
const input = fs.readFileSync(
  process.env.LOGNAME === 'jake' ? './input.txt' : '/dev/stdin',
).toString().trim().split('\n');
let [N, K] = input[0].split(' ').map(Number);
if (N >= K) {
  console.log(N - K);
} else {
  let result = 0;
  if (N === 0) {
    result += 1;
    N += 1;
  }
  const getCount = (num, length) => {
    let count = 0;
    const prefix = num >> (length - 1);
    count += prefix;
    num ^= (prefix << (length - 1));
    while (num) {
      while (!(num & 1)) {
        num >>= 1;
      }
      if ((num & 2)) {
        num += 1;
      }
      num >>= 2;
      count += 1;
    }
    return count;
  };
  let length = 1;
  while (N < K) {
    length += 1;
    N <<= 1;
  }
  const num1 = N - K;
  const num2 = K - (N >> 1);
  const count1 = getCount(num1, length);
  const count2 = getCount(num2, length - 1);
  console.log(result + Math.min(count1, count2));
}
결과 2
