[Swift 코테] 백준 1004 어린왕자

2022. 7. 19. 16:35Swift 코딩테스트/Swift 백준 문제 풀이

728x90

 

 


방정식도 없이 경로를 구하라고?

    - 그렇다. 내 맘대로 하면 되는 문제지만 사실 경로가 필요 없는 문제다.

    - 주어진 입력을 좌표상에 그려보고 규칙을 찾을 수 있었다.

    - 1. 출발과 도착지점이 원의 안에 있는지 밖에 있는지가 이 문제를 해결하는 방법이다.

          1 - 1. 출발과 도착지점이 원의 안에 있다면 원의 경계를 지나지 않고는 이동할 수 없기 때문에 카운트 +1 (= 보라색 점)

          1 - 2. 출발과 도착지점이 원의 밖에 있다면 해당 원은 무시해도 된다. (= 초록색 해당 없음)

   - 2. 여기서 주의할 점은 주황색 원이다.

          2 - 1. 출발과 도착지점 둘 다 주황색 원 안에 위치해 있다.

          2 - 2. 이 경우는 주황색 원을 지날 필요가 없기 때문에 카운트하지 않고 무시한다. (= 주황색 해당 없음)

    -3. 원의 안에 있는지 밖에 있는지는 어떻게 확인할 수 있는가?

          3 - 1. (x1 - x2)^2 + (y1 - y2)^2 < r^2: 점과 점의 길이를 구하는 공식으로 문제를 해결할 수 있다.

 

 


//코드

import Foundation
var T = Int(readLine()!)!

while T > 0 {
    let tmp = readLine()!.split(separator: " ").map{Int($0)!}
    let start = (x: tmp[0], y: tmp[1])
    let  end = (x: tmp[2], y: tmp[3])
    
    let n = Int(readLine()!)!
    var cnt = 0
    for i in 0..<n{
        let input = readLine()!.split(separator: " ").map{Int($0)!}
        
        //출발지점과 주어진 원 비교
        var startResult = getDistance(x1: start.x, y1: start.y, x2: input[0], y2: input[1], r: input[2])
        //도착지점과 주어진 원 비교
        var endResult = getDistance(x1: end.x, y1: end.y, x2: input[0], y2: input[1], r: input[2])
        
        //둘 중 하나만 지날 때 cnt += 1
        //둘 다 true인 경우는 주황색 원(= 출발과 도착이 둘 다 원 내부에 있을 때) 카운트 X
        //둘다 false인 경우는 아예 상관 없는 원
        if startResult == true && endResult == false {
            cnt += 1
        }else if startResult == false && endResult == true{
            cnt += 1
        }
    }
    print(cnt)
    T -= 1
}

//점과 점 사이의 거기를 구하는 함수
//기준점이 원의 내부에 존재하면 return true
//                존재하지 않으면 return false
func getDistance(x1: Int, y1: Int, x2: Int, y2: Int, r: Int) -> Bool{
    let distance = pow(Double(x1 - x2), 2) + pow(Double(y1 - y2), 2)
    if distance < pow(Double(r), 2){
        return true
    }else{
        return false
    }
}

 

 

 

728x90