반응형
터렛
코드
import sys
for _ in range(int(sys.stdin.readline().rstrip())) :
x1,y1,r1, x2,y2,r2 = map(int,sys.stdin.readline().split())
d = (abs(x1-x2)**2 + abs(y1-y2)**2)**.5
#동심원
if d == 0 :
#두 반지름이 같을 때 (교점은 무한대)
if r1==r2 : print(-1)
#두 반지름이 다를 떄 (만나지 않음)
else : print(0)
#동심원이 아닐 때
else :
sum = r1+r2
dif = abs(r1-r2)
#내부
if d < dif : print(0)
#내접
elif d == dif : print(1)
#두점에서 만나는 경우
elif dif < d and d < sum : print(2)
#외접
elif d == sum : print(1)
#외부
else : print(0)
해설
단순하게 두 원의 중점의 거리를 d, 첫 번째 원의 반지름을 r1, 두 번째 원의 반지름을 r2이라고 했을 때
두 원의 위치 관계는 크게 4가지가 존재한다.
- 교점이 무한대인 경우
두원이 완전히 겹칠 경우다. 즉, d가 0이며 r1과 r2가 같은 경우다. (d == 0 and r1 == r2) - 교점이 0개인 경우
두원이 아예 만나지 않는 경우다.
2.1) 외부에서 만나지 않는 경우 : r1+r2가 d보다 작을 때 발생하다. ( r1+r2 < d)
2.2) 내부에서 만나지 않는 경우 : |r2-r1|가 d보다 작을 때 발생한다. ( |r1-r2| < d)
2.3) 동심원인 경우(d가 0일 때) : r1과 r2가 같지 않으면 발생한다. (d == 0 and r1 != r2) - 교점이 1개인 경우
내접, 외접하는 경우
3.1) 외접하는 경우 : r1+r2가 d와 같을 때 발생
3.2) 내접하는 경우 : |r1-r2|가 d와 같을 때 발생 - 교점이 2개인 경우
r1+r2가 d보다 크고 |r1-r2|는 d보다 작을 때 발생
이를 정리하면
1. 동심원인 경우에는 두원의 반지름이 같으면 무한대, 두 반지름이 다르면 0개의 교점을 갖고
2. 동심원이 아닌 경우에는 아래 사진과 같이 정리가 된다.
이걸 토대로 코드를 짜면 된다!
반응형
'알고리즘 테스트 > 백준' 카테고리의 다른 글
백준 11729 : 하노이 탑 이동 순서 (파이썬) (0) | 2022.01.27 |
---|---|
백준 2447 : 별 찍기 - 10 (파이썬) (0) | 2022.01.26 |
백준 4948 : 베르트랑 공준 (파이썬) (0) | 2022.01.26 |
백준 1929 : 소수 구하기 (파이썬) (0) | 2022.01.25 |
백준 11653 : 소인수분해 (파이썬) (0) | 2022.01.25 |