728x90
https://www.acmicpc.net/problem/1002
문제
해설
이 문제에서는 이석원의 위치와 백승환의 위치로부터 류재영과의 거리를 알 수 있다.
따라서 한 지점에서 길이가 같은 점들의 집합인 원 두 개를 그려 접점의 개수를 확인하면 류재명이 있을 수 있는 좌표의 수를 알 수 있다.
우선 점점의 갯수에 대한 경우의 수를 보자.
두 점 사이의 거리를 d라 하고 다음에 의한 값을 갖는다는 것을 알아두자.$$\sqrt{(x2-x1)^2 + (y2-y1)^2}$$
- 두 원의 중심과 반지름이 같을 때
- 점점이 없을 때
- 두 점 사이의 거리가 각 원의 반지름의 합보다 클 때(d > r1 + r2)
- 한 원 안에 다른 원이 있고, 접점이 없을 때(d < |r1 - r2|)
- 두 점 사이의 거리가 각 원의 반지름의 합보다 클 때(d > r1 + r2)
- 접점이 한개일 때
- 내접할 때(d = |r1 - r2|)
- 외접할 때(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 |
댓글