문제
https://www.acmicpc.net/problem/1002
1002번: 터렛
각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.
www.acmicpc.net
풀이
조규현의 좌표에서 류재명과의 거리가 주어졌을 때, 류재명이 있을 수 있는 좌표는 어디일까요?
류재명은 이 보라색 테두리에 모두 위치해(무한대) 있을 수 있습니다.
그렇다면 조규현과 백승환의 좌표가 모두 주어진 경우를 확인해 봅시다.
이러한 경우에는 류재명이 2군데로 체크된 곳에 위치해 있을 수 있습니다.
아하 그렇다면 두 원이 서로 다른 두 점에서 만난다면? 류재명이 있을 수 있는 좌표는 2개가 되겠군요.
류재명이 있을 수 있는 좌표가 1개일 때는 어느 경우 일까요?
외접, 내접인 경우입니다.
류재명이 있을 수 있는 좌표가 없을 때는 두 원이 만나지 않는 경우겠네요!
마지막으로 류재명이 있을 수 있는 좌표가 무한대일 때는..?
두 원이 동심원이고, 반지름도 같을 때 입니다.
이제 두 원이 두 점에서 만나는 경우를 구해봅시다.
r1−r2<d<r1+r2 입니다.
거리(d)는 두 점의 거리이므로 d=√(x1−x2)2+(y1−y2)2 입니다.
두 원이 한점에서 만나는 경우는 외접과 내접이죠?
외접은 r1+r2=d 내접은 r2−r1=d 입니다.
무한대인 경우는? 동심원이고 반지름이 같을 때이므로
d = 0 && r1 == r2일 때입니다
그 외의 경우에는 두 원이 만나지 않는 경우입니다.
소스코드로 작성할 때, 저는 거리(d)에 루트를 씌우지 않고, 전부 제곱을 해준 형태로 구현하였습니다.
소스코드
import Foundation | |
func solution() { | |
let input = readLine()!.split(separator: " ").map { Int($0)! } | |
let x1 = input[0], y1 = input[1], r1 = input[2], x2 = input[3], y2 = input[4], r2 = input[5] | |
// 두 점 사이의 거리 | |
let distance = Int((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)) | |
// 동심원이고, 반지름이 같다면 | |
if distance == 0 && r1 == r2 { | |
print(-1) | |
} else if (r1 + r2) * (r1 + r2) == distance || (r2 - r1) * (r2 - r1) == distance { // 외접, 내접 | |
print(1) | |
} else if (r1 - r2) * (r1 - r2) + 1..<(r1 + r2) * (r1 + r2) ~= distance { // 두 원이 두 점에서 만날 때, | |
print(2) | |
} else { | |
print(0) | |
} | |
} | |
let n = Int(readLine()!)! | |
for _ in 0..<n { solution() } |
후기
직접 그려서 확인하면서 어떤 방식으로 접근해야할 지 알게되었습니다.
내접, 외접.. 오랜만에 들어봤는데 공식이 잘 기억이 안나더라구요..😂
덕분에 오랜만에 수학 공식을 확인해봤습니다.. 다시 기억해야지..
'PS > 백준' 카테고리의 다른 글
[BOJ] 백준 15649 N과 M (1) (Swift) (0) | 2023.03.20 |
---|---|
[BOJ] 백준 1004 어린왕자 (Swift) (0) | 2023.03.18 |
[BOJ] 백준 2477 참외밭 (Swift) (1) | 2023.03.16 |
[BOJ] 백준 3009 네 번째 점 (Swift) (0) | 2023.03.16 |
[BOJ] 백준 1085 직사각형에서 탈출 (Swift) (0) | 2023.03.16 |