Processing math: 100%
본문 바로가기

PS/백준

[BOJ] 백준 1002 터렛 (Swift)

반응형

문제

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

 

1002번: 터렛

각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.

www.acmicpc.net

풀이

조규현의 좌표에서 류재명과의 거리가 주어졌을 때, 류재명이 있을 수 있는 좌표는 어디일까요?

연습장 (3)

류재명은 이 보라색 테두리에 모두 위치해(무한대) 있을 수 있습니다.

그렇다면 조규현과 백승환의 좌표가 모두 주어진 경우를 확인해 봅시다.

이러한 경우에는 류재명이 2군데로 체크된 곳에 위치해 있을 수 있습니다.

image

아하 그렇다면 두 원이 서로 다른 두 점에서 만난다면? 류재명이 있을 수 있는 좌표는 2개가 되겠군요.

류재명이 있을 수 있는 좌표가 1개일 때는 어느 경우 일까요?
외접, 내접인 경우입니다.

image

 

 

image

류재명이 있을 수 있는 좌표가 없을 때두 원이 만나지 않는 경우겠네요!

image

 

image

마지막으로 류재명이 있을 수 있는 좌표가 무한대일 때는..?
두 원이 동심원이고, 반지름도 같을 때 입니다.

이제 두 원이 두 점에서 만나는 경우를 구해봅시다.
r1r2<d<r1+r2 입니다.
거리(d)는 두 점의 거리이므로 d=(x1x2)2+(y1y2)2 입니다.

두 원이 한점에서 만나는 경우외접과 내접이죠?
외접r1+r2=d 내접r2r1=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() }
view raw 터렛.swift hosted with ❤ by GitHub

후기

직접 그려서 확인하면서 어떤 방식으로 접근해야할 지 알게되었습니다.
내접, 외접.. 오랜만에 들어봤는데 공식이 잘 기억이 안나더라구요..😂
덕분에 오랜만에 수학 공식을 확인해봤습니다.. 다시 기억해야지..

반응형