BOJ[1002] - 터렛 by JavaScript
터렛
문제
언어
- JavaScript
문제 풀이 step 1
- 결론부터 말씀드리면 두 원이 주어졌을 때 접점의 수를 구하는 문제입니다. (문제에서도 좌표는 x, y 그리고 거리는 r로 설명하며 원의 방정식을 암시해주고 있습니다.)
- 조규현과 백승환 둘의 위치에서 현재 적까지 거리의 모든 경우의 수를 그리면 두 개의 원이 나옵니다.
- 그래서 두 개의 원이 가질 수 있는 모든 경우의 수를 나열하면
- 두 점에서 만나는 경우
r' - r < d < r' + r
- 한 점에서 만나는 경우 (외점, 내접)
r' + r === dr' - r === d and d !== 0(d !== 0 주의!!)
- 만나지 않는 경우 (외부, 내부1, 내부2)
r' + r < dd < r' - rd === 0 and r !== r'
- 완전 겹치는 경우
d === 0 and r' === r
- 두 점에서 만나는 경우
- 오차를 없애기 위해서 근호를 쓰지않고, 제곱을 한 상태에서 비교를 진행합니다.
- 참고 : https://mathbang.net/101
소스 코드
const input = require("fs").readFileSync("/dev/stdin").toString().split("\n");
const solution = (input) => {
const res = [];
let T = parseInt(input[0]);
let index = 1;
while (T--) {
const [x1, y1, r1, x2, y2, r2] = input[index++].split(" ").map(Number);
const d = Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2);
if (Math.pow(r1 - r2, 2) < d && d < Math.pow(r1 + r2, 2)) res.push(2);
else if (
Math.pow(r1 + r2, 2) === d ||
(Math.pow(r1 - r2, 2) === d && d !== 0)
)
res.push(1);
else if (
Math.pow(r1 + r2, 2) < d ||
d < Math.pow(r1 - r2, 2) ||
(d === 0 && r1 !== r2)
)
res.push(0);
else if (d === 0 && r1 === r2) res.push(-1);
}
return res.join("\n");
};
console.log(solution(input));