[boj] 1011. Fly me to the Alpha Centauri (node.js)

호이·2022년 2월 9일
0

algorithm

목록 보기
18/77
post-thumbnail

문제 요약

BOJ 1011 Fly me to the Alpha Centauri

  • 입력: 테스트 케이스의 수와 시작지점, 도착지점이 주어진다.
  • 출력: 시작지점부터 도착지점까지의 한 번에 이동할 수 있는 거리의 조건이 주어진다. 이때 최단 이동 횟수를 구하라.

풀이

  • 주어진 이동 규칙이 이전 이동거리의 +(-1), +0, +1만큼만 이동 가능하므로, 좌우대칭을 기준으로 최단 이동 횟수를 구하고 남은 거리에 대해서 처리해 주는 방식으로 답을 구했다.
  • 절반 거리만큼 계속 +1만을 선택히 이동했을 때의 이동 횟수가 최소이므로, 이를 구한 후 좌우 동일하게 이동한다고 가정하였다.
  • 그 후 남은 거리가 0인 경우, 현재 이동거리보다 작거나 같은 경우, 큰 경우 세 가지에 따라 예외처리한다.

내 풀이

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let cnt = 0;
const input = () => stdin[cnt++];

let stdin = [];
rl.on("line", function (line) {
  stdin.push(line);
}).on("close", function () {
  const N = input();
  let results = [];
  for (let i = 0; i < N; i++) {
    const [start, end] = input().split(" ");
    const dist = end - start;
    results.push(solution(dist));
  }
  console.log(results.join("\n"));
  process.exit();
});

const solution = (dist) => {
  let i = 1,
    sum = 0,
    halfDist = dist / 2;
  while (true) {
    sum += i;
    if (sum >= halfDist) {
      sum -= i;
      let move = (i - 1) * 2;
      let leftDist = (halfDist - sum) * 2;
      if (leftDist == 0) return move;
      if (leftDist > i) {
        move += 2;
      } else {
        move += 1;
      }
      return move;
    }
    i++;
  }
};
profile
매일 부활하는 개복치

0개의 댓글