터렛

문제

언어

  • JavaScript

문제 풀이 step 1

  • 결론부터 말씀드리면 두 원이 주어졌을 때 접점의 수를 구하는 문제입니다. (문제에서도 좌표는 x, y 그리고 거리는 r로 설명하며 원의 방정식을 암시해주고 있습니다.)
  • 조규현과 백승환 둘의 위치에서 현재 적까지 거리의 모든 경우의 수를 그리면 두 개의 원이 나옵니다.
  • 그래서 두 개의 원이 가질 수 있는 모든 경우의 수를 나열하면
    1. 두 점에서 만나는 경우
      • r' - r < d < r' + r
    2. 한 점에서 만나는 경우 (외점, 내접)
      • r' + r === d
      • r' - r === d and d !== 0 (d !== 0 주의!!)
    3. 만나지 않는 경우 (외부, 내부1, 내부2)
      • r' + r < d
      • d < r' - r
      • d === 0 and r !== r'
    4. 완전 겹치는 경우
      • 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));