[백준 1002] 터렛

백준 1002번: 터렛 - 상세 풀이

백준 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. 접근 방법

  1. 두 터렛의 좌표와 반지름을 입력받음
  2. 두 터렛의 중심 거리 d를 계산
  3. 조건에 따라 교점 개수를 판별
  4. 결과를 출력

⚙️ 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. 결론

기하학적 개념과 조건문을 활용한 문제로, 유클리드 거리와 조건 판별을 통해 효율적으로 해결할 수 있습니다.

다음 이전