고등학교 때 최애 과목이 확률과 통계, 기하와 벡터였던 나… 개발자가 되려는 복선이었을지도…?🤔 백준 1002번 터렛은 고등학교 때 추억이 새록새록 떠오르는 문제다.
중점의 좌표와 거리가 주어져 적이 존재하는 위치를 원으로 나타낼 수 있고, 두 원의 접점이 적이 있을 수 있는 좌표이다. 그래서 이 문제는 두 원의 접점의 수를 구하는 문제이다.(두근)🤭
두 원의 중점사이의 거리와 접점 개수의 관계를 그림으로 나타내면 아래와 같다.
r1, r2는 각각 두 원의 반지름을 나타낸다.
두 원의 중점사이의 거리와 접점 개수의 관계
그리고 문제에서 말하는, 적이 있을곳이 무수히 많은 경우는 두 원이 완전히 포개어지는 경우를 말한다. 이 모든 경우의 수를 정리하면 아래와 같다.
- 중점사이의 거리가 0이고 r1==r2 이면 두 원은 일치(무한개)
- 중점사이의 거리가 r1-r2 또는 r1+r2 이면 두 원은 외/내접(1개)
- 중점사이의 거리가 r1-r2 보다는 크고 r1+r2 보다는 작다면 두 점에서 만남(2개)
- 그 외에는 만나지 않는다. (0개)
그리고 중점사이의 거리를 아래와 같이 구하게되는데, 좌표의 차를 제곱하는 형태이므로 양수 음수를 고려하지 않아도 된다.
\[{dist=\sqrt{(x1-x2)^2+(y1-y2)^2}}\]루트 계산이 번거롭기 때문에, 중점사이의 거리와 비교하려는 값 모두 제곱해서 사용했다.
그래서 아래는 결과 코드이다. BOJ Node.js 제출 통과했다!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// BOJ 값 입력 코드
// let input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n')
input = ["3", "0 0 13 40 0 37", "0 0 3 0 7 4", "1 1 1 1 1 5"];
input.splice(0, 1);
let x1, y1, r1, x2, y2, r2, dist;
for (data of input) {
[x1, y1, r1, x2, y2, r2] = data.split(" ").map(Number);
dist = (x1 - x2) ** 2 + (y1 - y2) ** 2;
if (dist == 0 && r1 == r2) {
console.log(-1);
} else if (dist == (r1 + r2) ** 2 || dist == (r1 - r2) ** 2) {
console.log(1);
} else if (dist < (r1 + r2) ** 2 && dist > (r1 - r2) ** 2) {
console.log(2);
} else {
console.log(0);
}
}
간만에 추억이 새록새록이었다.🙂