[boj] 1002. 터렛 (node.js)

호이·2022년 4월 14일
0

algorithm

목록 보기
53/77
post-thumbnail

문제 요약

[boj] 1002. 터렛 (node.js)

풀이

  • 두 원의 위치관계에서, 중심 사이의 거리와 두 원의 반지름의 길이를 통해 접점의 개수를 파악하는 문제.
  • 원의 위치관계는 중심 사이의 거리와 반지름의 차, 합을 알면 구할 수 있다.
  • 먼저, 내접과 외접을 구분할 줄 알아야 어떤 조건으로 해당 경우를 파악할지 결정할 수 있다.
    1. 내, 외접 파악: 내접, 외접은 중심 사이의 거리를 반지름의 차, 합을 기준으로 구간을 나눈 후 구분할 수 있다. 거리 < 차 이면 접점이 없는 내접, 거리 > 합 이면 접점이 없는 외접이다. 나머지 '차 <= 거리 <= 합' 구간에서는 == 일 때는 한 점에서 접하고, 그렇지 않을 때는 두 교점이 생긴다.
  • 참고한 블로그: https://mathbang.net/101 (그림을 보면 이해가 더 빠르다.)

내 풀이

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

const solution = () => {
  const [x1, y1, r1, x2, y2, r2] = input().split(" ").map(Number);
  const dist = Math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2);
  const sum = r1 + r2;
  const diff = Math.abs(r1 - r2);
  if (dist == 0 && diff == 0) return -1;
  if (dist < diff) {
    return 0;
  } else if (dist < sum) {
    if (dist == diff) return 1;
    return 2;
  } else {
    if (dist == sum) return 1;
    return 0;
  }
};

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

let stdin = [];
rl.on("line", function (line) {
  stdin.push(line);
}).on("close", function () {
  let T = Number(input());
  let result = [];
  while (T--) {
    result.push(solution());
  }
  console.log(result.join("\n"));
  process.exit();
});

주절주절

  • 단계별로 풀어보기 초반에 있는 문제라 간단할 줄 알았는데, 정말 수학적인 접근이 필요한 문제여서 생각보다 시간이 걸렸다. 원의 위치관계 문제임을 파악한 후에는 경우의 수를 따졌어야 하는데, 문제를 얕보고 잘못된 식을 세운 후 계속 디버깅하며 반례를 매우려고 노력하다가, 그제서야 내가 알고리즘을 잘 이해하지 않았음을 깨달았다.
  • 알고리즘 문제를 풀 때는 풀이 과정을 시작부터 끝까지 논리를 점검한 후, 코드로는 후루룩 작성할 수 있는 능력을 갖추는 걸 목표로 노력하자!
profile
매일 부활하는 개복치

0개의 댓글