1002 터렛

이 문제는 각 좌표(x1, y1), (x2, y2)가 원의 중심이고, 반지름이 r1, r2 일 때 두 원의 접점의 개수를 출력하는 문제다.

먼저 두 원 중심의 거리두 반지름의 합, 두 반지름의 차이를 알아야한다.

  1. dist = 두 원 중심의 거리
  2. rsum = 두 반지름의 합
  3. rsub = 두 반지름의 차

접점이 무한대일 경우

두 원의 접점이 무한대일 경우는 두 원이 완전히 겹쳐졌을 경우이다. 즉, 크기가 동일(rsub = 0)하고, 좌표가 같다(dist = 0).

dist === 0 || rsub === 0

접점이 없을 경우

  1. 두 원이 조금도 포함관계를 이루지 않을 경우 (dist > rsum)
  2. 한 원 안에 다른 원이 접점없이 완전히 포함될 경우 (dist < rsub)

dist > rsum || dist < rsub

접점이 하나일 경우

  1. 한 원 안에 다른 원이 완전히 포함되어 접점이 하나일 경우 (dist = rsum)
  2. 두 원이 포함관계를 이루지 않으나 하나의 접점이 있을 경우 (dist = rsub)

dist === rsum || dist === rsub

접점이 두개일 경우

두 원 중심의 거리가 두 반지름 합보다 작고, 두 반지름 차이보다 클 경우

dist < rsum && dist > sub

const fs = require('fs');
const [count, ...input] = fs.readFileSync('../input.txt').toString().trim().split('\n');

input.map((t) => {
  const [x1, y1, r1, x2, y2, r2] = t.split(' ').map(Number);
  const dist = Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)); // 두 좌표의 거리
  const rsum = r1 + r2; // 두 원의 반지름 합
  const rsub = Math.abs(r1 - r2); // 두 반지름 차의 절댓값

  if ((dist === 0) & (rsub === 0)) return console.log(-1);
  if (dist > rsum || dist < rsub) return console.log(0);
  if (dist === rsum || dist === rsub) return console.log(1);
  console.log(2);
});

풀이 참고