Home [BOJ] 1002 터렛 풀이
Post
Cancel

[BOJ] 1002 터렛 풀이

고등학교 때 최애 과목이 확률과 통계, 기하와 벡터였던 나… 개발자가 되려는 복선이었을지도…?🤔 백준 1002번 터렛은 고등학교 때 추억이 새록새록 떠오르는 문제다.

중점의 좌표와 거리가 주어져 적이 존재하는 위치를 원으로 나타낼 수 있고, 두 원의 접점이 적이 있을 수 있는 좌표이다. 그래서 이 문제는 두 원의 접점의 수를 구하는 문제이다.(두근)🤭


두 원의 중점사이의 거리와 접점 개수의 관계를 그림으로 나타내면 아래와 같다.
r1, r2는 각각 두 원의 반지름을 나타낸다.


Portfolio Project Design 두 원의 중점사이의 거리와 접점 개수의 관계

그리고 문제에서 말하는, 적이 있을곳이 무수히 많은 경우는 두 원이 완전히 포개어지는 경우를 말한다. 이 모든 경우의 수를 정리하면 아래와 같다.

  1. 중점사이의 거리가 0이고 r1==r2 이면 두 원은 일치(무한개)
  2. 중점사이의 거리가 r1-r2 또는 r1+r2 이면 두 원은 외/내접(1개)
  3. 중점사이의 거리가 r1-r2 보다는 크고 r1+r2 보다는 작다면 두 점에서 만남(2개)
  4. 그 외에는 만나지 않는다. (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);
  }
}


간만에 추억이 새록새록이었다.🙂

This post is licensed under CC BY 4.0 by the author.

[Blog] Git Blog에 댓글 기능 추가하기 (Jekyll, Chirpy, 400, 404 Error 정리)

[Roadmap] 프론트엔드 개발자 준비하기 Frontend Developer Roadmap