[Swift 코테] 백준 1004 어린왕자
2022. 7. 19. 16:35ㆍSwift 코딩테스트/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
'Swift 코딩테스트 > Swift 백준 문제 풀이' 카테고리의 다른 글
[Swift 코테] 백준 2981검문 (swift 런타임 에러) (0) | 2022.08.02 |
---|---|
[Swift 코테] 백준 2609 최대공약수와 최소공배수 (0) | 2022.07.27 |
[Swift 코테] 백준 2477 참외밭 (0) | 2022.07.17 |
[Swift 코테] 백준 2108 통계학 (0) | 2022.06.02 |
[Swift 코테] 백준 10872 팩토리얼 (0) | 2022.04.26 |