[boj] 1002. 터렛 (node.js)
문제 요약
풀이
- 두 원의 위치관계에서, 중심 사이의 거리와 두 원의 반지름의 길이를 통해 접점의 개수를 파악하는 문제.
- 원의 위치관계는 중심 사이의 거리와 반지름의 차, 합을 알면 구할 수 있다.
- 먼저, 내접과 외접을 구분할 줄 알아야 어떤 조건으로 해당 경우를 파악할지 결정할 수 있다.
- 내, 외접 파악: 내접, 외접은 중심 사이의 거리를 반지름의 차, 합을 기준으로 구간을 나눈 후 구분할 수 있다. 거리 < 차 이면 접점이 없는 내접, 거리 > 합 이면 접점이 없는 외접이다. 나머지 '차 <= 거리 <= 합' 구간에서는 == 일 때는 한 점에서 접하고, 그렇지 않을 때는 두 교점이 생긴다.
- 참고한 블로그: https://mathbang.net/101 (그림을 보면 이해가 더 빠르다.)
내 풀이
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const solution = () => {
const [x1, y1, r1, x2, y2, r2] = input().split(" ").map(Number);
const dist = Math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2);
const sum = r1 + r2;
const diff = Math.abs(r1 - r2);
if (dist == 0 && diff == 0) return -1;
if (dist < diff) {
return 0;
} else if (dist < sum) {
if (dist == diff) return 1;
return 2;
} else {
if (dist == sum) return 1;
return 0;
}
};
let _line = 0;
const input = () => stdin[_line++];
let stdin = [];
rl.on("line", function (line) {
stdin.push(line);
}).on("close", function () {
let T = Number(input());
let result = [];
while (T--) {
result.push(solution());
}
console.log(result.join("\n"));
process.exit();
});
주절주절
- 단계별로 풀어보기 초반에 있는 문제라 간단할 줄 알았는데, 정말 수학적인 접근이 필요한 문제여서 생각보다 시간이 걸렸다. 원의 위치관계 문제임을 파악한 후에는 경우의 수를 따졌어야 하는데, 문제를 얕보고 잘못된 식을 세운 후 계속 디버깅하며 반례를 매우려고 노력하다가, 그제서야 내가 알고리즘을 잘 이해하지 않았음을 깨달았다.
- 알고리즘 문제를 풀 때는 풀이 과정을 시작부터 끝까지 논리를 점검한 후, 코드로는 후루룩 작성할 수 있는 능력을 갖추는 걸 목표로 노력하자!
Author And Source
이 문제에 관하여([boj] 1002. 터렛 (node.js)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@greenish0902/boj-1002.-터렛-node.js저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)