
const fs = require('fs');
const path = process.platform === 'linux' ? '/dev/stdin' : 'input.txt';
const [[_], ...inputs] = fs
.readFileSync(path)
.toString()
.trim()
.split('\n')
.map((it) => it.split(' ').map(Number));
for (const [x1, y1, r1, x2, y2, r2] of inputs) {
const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);
const rSum = r1 + r2;
const rDiff = Math.abs(r1 - r2);
if (x1 === x2 && y1 === y2 && r1 === r2) console.log(-1); // 무한대
else if (distance > rSum) console.log(0); // 만나지 않음
else if (distance < rDiff) console.log(0);
else if (Math.abs(distance - rSum) < 1e-6 || Math.abs(distance - rDiff) < 1e-6) console.log(1);
else console.log(2); // 두 점에서 만남
}
⏰ 소요한 시간 : -
입력은 여러개의 테스트 케이스로 이루어져 있는데, 하나의 테스트 케이스는 두 좌표와 좌표에서 목표물까지의 거리 r이 주어진다.
두 좌표값을 원의 중심이라고 생각하고 목표물까지의 거리를 반지름이라고 계산하면 이 문제는 두 원의 위치관계로 풀이할 수 있다.
두 좌표값의 거리와 반지름의 합을 구해서 두 원이 만나지 않는지, 혹은 두 점에서 만나는지, 외접/내접하는지를 구해서 조건에 맞게 정답을 출력한다.