백준 1002번: 터렛 - 상세 풀이
🔍 1. 문제 소개
백준 1002번 문제 "터렛"은 두 개의 터렛(원)의 위치와 반지름이 주어졌을 때, 두 터렛의 교점 개수를 구하는 문제입니다.
💡 2. 문제 해석
두 원의 중심 거리 d와 반지름 r1, r2의 관계를 분석하여 교점의 개수를 판별합니다.
- d > r1 + r2: 서로 떨어져 있어 교점 없음 (0개)
- d < |r1 - r2|: 한 원이 다른 원 안에 포함되어 있어 교점 없음 (0개)
- d = r1 + r2: 두 원이 외접 (1개)
- d = |r1 - r2|: 두 원이 내접 (1개)
- |r1 - r2| < d < r1 + r2: 두 원이 교차 (2개)
- d = 0, r1 = r2: 두 원이 완전히 일치 (무한대, -1 출력)
🧠 3. 접근 방법
- 두 터렛의 좌표와 반지름을 입력받음
- 두 터렛의 중심 거리 d를 계산
- 조건에 따라 교점 개수를 판별
- 결과를 출력
⚙️ 4. 구현 과정
유클리드 거리 공식을 활용하여 중심 간 거리 d를 구하고, 조건문을 통해 교점 개수를 판별합니다.
💻 5. 코드 설명
import kotlin.math.*
fun main() {
val t = readLine()!!.toInt()
repeat(t) {
val input = readLine()!!.split(" ").map { it.toInt() }
val (x1, y1, r1, x2, y2, r2) = input.map { it.toDouble() }
val distance = hypot(x2 - x1, y2 - y1)
when {
x1 == x2 && y1 == y2 && r1 == r2 -> println(-1)
distance > (r1 + r2) || distance < abs(r1 - r2) -> println(0)
distance == (r1 + r2) || distance == abs(r1 - r2) -> println(1)
else -> println(2)
}
}
}
⏱️ 6. 시간 및 공간 복잡도
- 시간 복잡도: O(T), 각 테스트 케이스당 상수 연산
- 공간 복잡도: O(1), 추가적인 메모리 사용 없음
🎯 7. 결론
기하학적 개념과 조건문을 활용한 문제로, 유클리드 거리와 조건 판별을 통해 효율적으로 해결할 수 있습니다.