[백준] 1004번 어린왕자

Greenddoovie·2021년 12월 10일
0

백준

목록 보기
2/30

1004번 어린왕자

접근방법

원의 방정식을 이용해 해당 점이 원의 안에 있는지 밖에 있는지 판단하여 만나야하는 점의 개수를 파악했다.

1) 두 점이 한 원의 내부에 있는 경우

  • 원의 경계선을 지나지 않는다

2) 두 점 모두 한 원의 밖에 있는 경우

  • 원 밖으로 이동해서 가면 된다

3) 두 점 중 한 점만 한 원의 안에 있는 경우

  • 해당 점에 도착하기 위해서는 원을 반드시 지나야하므로 경계선을 지나간다
import java.io.BufferedReader
import java.io.InputStreamReader
import kotlin.math.pow

val br = BufferedReader(InputStreamReader(System.`in`))
fun main() {
    val testNum = br.readLine().trim().toInt()
    val ansList = mutableListOf<Int>()
    for (i in 0 until testNum) {
        val (x1,y1, x2,y2) = br.readLine().trim().split(" ")
        val points = listOf(Point(x1.toInt(),y1.toInt()), Point(x2.toInt(),y2.toInt()))
        val plantNum = br.readLine().trim().toInt()
        val plantList = mutableListOf<Plant>()
        repeat(plantNum) {
            val (cx, cy, r) = br.readLine().trim().split(" ")
            plantList.add(Plant(cx.toInt(), cy.toInt(), r.toInt()))
        }
        var ans = 0
        plantList.forEach { plant ->
            var meet = 0
            points.forEach { point ->
                meet += checkInAndOut(point, plant)
            }
            if (meet == 1) {
                ans++
            }
        }
        ansList.add(ans)
    }
    ansList.forEach {
        println(it)
    }
}

fun checkInAndOut(point: Point, plant: Plant): Int {
    val left = (point.x - plant.cx).toFloat().pow(2) + (point.y - plant.cy).toFloat().pow(2)
    val right = plant.r.toFloat().pow(2)
    return if (left <= right) 1 else 0
}

data class Plant(val cx: Int, val cy: Int, val r: Int)
data class Point(val x:Int, val y: Int)
profile
기초를 이해하면 세상이 다르게 보인다

0개의 댓글