문제 링크
풀이
import sys
t = int(sys.stdin.readline())
for i in range(t):
x1, y1, r1, x2, y2, r2 = map(int, sys.stdin.readline().split())
d = ((x1-x2)**2 + (y1-y2)**2)**0.5
if x1 == x2 and y1 == y2 and r1 == r2: print(-1)
elif d > r1 + r2: print(0)
elif d == r1 + r2: print(1)
elif d < r1 + r2:
if r1 >= r2 and d == r1 - r2: print(1)
elif r1 < r2 and d == r2 - r1: print(1)
elif r1 >= r2 and d < r1 - r2: print(0)
elif r1 < r2 and d < r2 - r1: print(0)
else: print(2)
(x1, y1)을 원점으로 하고 반지름의 길이가 r1인 원과 (x2, y2)를 원점으로 하고 반지름의 길이가 r2인 원이 서로 만나는 점의 개수가 곧 류재명이 존재할 수 있는 위치의 개수다.
두 원점 사이의 거리를 d, 더 긴 반지름을 r, 짧은 반지름을 r'(두 반지름의 길이가 같다면 어떤 것을 r, r'로 놓아도 상관 없음)라고 하겠다. 이 때 두 원의 위치 관계를 총 6가지로 나눌 수 있다.
1) 두 원이 서로 떨어져 있는 경우(0개) d > r + r'
2) 두 원이 접하는 경우(1개) d = r + r'
3) 두 원이 겹쳐 있는 경우(2개) d < r + r'
그런데, d < r + r'라고 해서 모두 두 원이 겹쳐 있는 경우는 아니다.
4) 작은 원이 큰 원 안에서 접하는 경우(1개) d = r - r'
5) 작은 원이 큰 원 안에 들어와서 접하지 않는 경우(0개) d < r - r'
6) 두 원이 완전히 겹치는 경우(무한개)
위의 경우를 모두 조건식으로 구현하여 풀었다.
'연습장 > 백준(BOJ) 문제풀이' 카테고리의 다른 글
[백준 10996] 별 찍기 - 21 with Node.js (0) | 2021.04.01 |
---|---|
[백준 10808] 알파벳 개수 with Node.js (0) | 2021.04.01 |
[백준 5585] 거스름돈 with Node.js (0) | 2021.03.31 |
[백준 1920] 수 찾기 with Python (0) | 2021.03.31 |
[백준 2231] 분해합 with Node.js (0) | 2021.03.30 |