Algorithm/BOJ

[코테] 어린 왕자

짱죠니 2024. 3. 8. 23:06

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

 

1004번: 어린 왕자

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 첫째 줄에 출발점 (x1, y1)과 도착점 (x2, y2)이 주어진다. 두 번째 줄에는 행성계의 개수 n이 주

www.acmicpc.net

 

제출한 코드

import Foundation

let t = Int(readLine()!)!
for _ in 0..<t {
    let xy = readLine()!.components(separatedBy: " ").map({ Int($0) ?? 0 })
    let x1 = xy[0], y1 = xy[1], x2 = xy[2], y2 = xy[3]
    
    let n = Int(readLine()!)!
    var cnt = 0
    for _ in 0..<n {
        let xyr = readLine()!.components(separatedBy: " ").map({ Int($0) ?? 0 })
        let x = xyr[0], y = xyr[1], r = xyr[2]
        
        let dis1 = (x1-x) * (x1-x) + (y1-y) * (y1-y)
        let dis2 = (x2-x) * (x2-x) + (y2-y) * (y2-y)
        let radius = r * r
        
        if dis1 < radius && dis2 < radius {
            continue
        }
        
        if dis1 < radius {
            cnt += 1
        }
        if dis2 < radius {
            cnt += 1
        }
    }
    print(cnt)
}

 

 

x1, y1 혹은 x2, y2와 현재 좌표 x, y의 거리가 반지름보다 작다면 해당 원을 통과해야 하므로 cnt += 1 해줘야 한다.

 

하지만 이때 주의해야 하는 경우는 

x1, y1과 x2, y2가 현재 원 안에 갇힌 경우는 거리가 반지름보다 작지만 cnt에 포함하지 않아야 한다.

 

따라서 x1, y1와의 거리도 반지름보다 작고, x2, y2와의 거리도 반지름 보다 작다면

해당 원을 계산을 진행하지 않는다.

 

 

 

수학문제 같은 느낌 ~~...