PS(Problem Solving)/BOJ

[백준/BOJ] 1002번: 터렛

JunsuKim 2021. 11. 2.
728x90

https://www.acmicpc.net/problem/1002

 

1002번: 터렛

각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.

www.acmicpc.net

문제

해설

이 문제에서는 이석원의 위치와 백승환의 위치로부터 류재영과의 거리를 알 수 있다.

따라서 한 지점에서 길이가 같은 점들의 집합인 원 두 개를 그려 접점의 개수를 확인하면 류재명이 있을 수 있는 좌표의 수를 알 수 있다.

우선 점점의 갯수에 대한 경우의 수를 보자.

두 점 사이의 거리를 d라 하고 다음에 의한 값을 갖는다는 것을 알아두자.$$\sqrt{(x2-x1)^2 + (y2-y1)^2}$$

  1. 두 원의 중심과 반지름이 같을 때 
  2. 점점이 없을 때
    • 두 점 사이의 거리가 각 원의 반지름의 합보다 클 때(d > r1 + r2)
    • 한 원 안에 다른 원이 있고, 접점이 없을 때(d < |r1 - r2|)
  3. 접점이 한개일 때
    • 내접할 때(d = |r1 - r2|)
    • 외접할 때(d = r1 + r2)

이에 해당되지 않는다면 당연히 접점은 2개이다.

소스코드

import kotlin.math.*

fun main(){
    val n = readLine()!!.toInt()
    for(i: Int in 1..n) {
        val info = readLine()!!.split(" ")
        val typeChange = change(info)
        val result = tangentPoint(typeChange)
        println(result)
    }
}

fun change(argument: List<String>): ArrayList<Double> {
    val array = ArrayList<Double>()
    for(i in argument.indices) array.add(argument.get(i).toDouble())
    return array
}

fun tangentPoint(info: List<Double>): Int {
    val distance = sqrt((info[3] - info[0]).pow(2) + (info[4] - info[1]).pow(2))
    return if(info[0] == info[3] && info[1] == info[4] && info[2] == info[5]) -1
    else if(distance > (info[2] + info[5]) || (info[0] == info[3] && info[1] == info[4] && info[2] != info[5]) || distance < abs(info[2] - info[5])) 0
    else if(distance == (info[2] + info[5]) || distance == abs(info[2] - info[5])) 1
    else 2
}
728x90

'PS(Problem Solving) > BOJ' 카테고리의 다른 글

[백준/BOJ] 1271번: 엄청난 부자2  (1) 2021.11.05
[백준/BOJ] 10757번: 큰 수 A+B  (3) 2021.11.04
[백준/BOJ] 1003번: 피보나치 함수  (1) 2021.11.03
[백준/BOJ] 1000번: A+B  (1) 2021.11.01
[백준/BOJ] 1001번: A-B  (0) 2021.11.01

댓글