문제
조규현의 좌표 (x1, y1)와 백승환의 좌표 (x2, y2)가 주어진다.
조규현이 계산한 류재명과의 거리 r1과 백승환이 계산한 류재명과의 거리 r2가 주어진다.
류재명이 있을 수 있는 좌표의 수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 이루어져 있다.
한 줄에 x1, y1, r1, x2, y2, r2가 주어진다.
x1, y1, x2, y2는 -10,000보다 크거나 같고, 10,000보다 작거나 같은 정수이다.
r1, r2는 10,000보다 작거나 같은 자연수이다.
출력
각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다.
만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.
수학에서 원의 내접과 외접을 이해하면 해결할 수 있는 문제입니다.
수학 지식이 부족했기 때문에 공부하고 왔습니다...★
결과를 구하기 위해서는 두 좌표( (x1, y1), (x2, y2) ) 사이의 거리인 d.
각 좌표가 중점이고 반지름이 r1, r2인 원을 알아야 합니다.
① 류재명이 있을 수 없는 경우 ( = 교점이 0개인 원)
두 원이 너무 멀리 떨어져 있거나 하나의 원이 다른 원 안에 들어가 있는 경우에는 교점이 없습니다.
두 원이 멀리 떨어져 있게 되면 중점 사이의 거리 d는 두 원의 반지름의 합보다 큰 값을 가집니다.
하나의 원이 다른 원 안에 있을 때는 d와 작은 원의 반지름 r1을 더해도 r2를 넘지 못합니다.
( r2 > r1 + d => r2 - r1 > d )
② 류재명이 한 곳에 있을 수 있는 경우 ( = 교점이 1개인 원)
하나의 원이 다른 원과 밖이나 안에서 맞붙어 있을 때 교점이 1개 생깁니다.
밖에서 맞붙었을 때는 거리 d는 두 원의 반지름의 합과 같습니다.
안에서 맞붙었을 때는 d와 작은 원의 반지름의 합이 큰 원의 반지름과 같게 됩니다.
( d + r1 = r2 => d = r2 - r1 )
③ 류재명이 2곳에 있을 수 있는 경우 ( = 교점이 2개인 원)
교점이 2개일 수 있는 경우는 거리 d가 두 원이 만날 수 없는 거리(r2-r1)보다 크거나 두 원이 밖에서 맞물리는 거리(r1+r2)보다 가까워야 가능합니다.
문제에서는 류재명이 있을 수 있는 위치가 무한개인 경우도 포함됩니다.
이는 두 원이 완전히 일치했을 경우와 같습니다.
두 원이 완전히 일치하게 된다면 중점의 위치가 같기 때문에 거리 d = 0입니다.
중점이 같음과 동시에 반지름도 같아야 두 원이 같은 원이기 때문에 반지름 r1과 r2의 값이 같습니다.
python3 소스코드
from math import sqrt
cnt = int(input())
for i in range(cnt):
x1, y1, r1, x2, y2, r2 = map(int, input().split())
if x1 == x2: # 같은 x축인 경우 거리는 y의 차
distance = abs(y2 - y1)
elif y1 == y2: # 같은 y축인 경우 거리는 x의 차
distance = abs(x2 - x1)
else: # 좌표가 같은 축에 없는 경우
distance = sqrt((x2-x1)**2 + (y2-y1)**2)
if distance == 0 and r1 == r2: # 좌표와 거리가 모두 같은 경우 (무한대)
print(-1)
elif r1 + r2 < distance or abs(r2-r1) > distance: # 교점이 없는 경우
print(0)
elif r1 + r2 == distance or abs(r2-r1) == distance: # 교점이 1개인 경우
print(1)
else: # 교점이 2개인 경우
print(2)
입력되는 두 원 중에서 꼭 첫 번째 원이 작다는 가정이 없기 때문에 절댓값 함수 abs()를 통해 값을 일치시켰습니다.
- 끝 -
'작업 > Problem Solving' 카테고리의 다른 글
백준 1003(피보나치 함수) 파이썬(Python) 해결 (0) | 2021.05.03 |
---|---|
백준 1100(하얀 칸) 파이썬(Python) 해결 (0) | 2021.03.01 |
백준 3053(택시 기하학) 파이썬(python) 해결 (0) | 2020.12.26 |
백준 4153(직각삼각형) 파이썬(python) 해결 (0) | 2020.12.26 |
백준 3009(네 번째 점) 파이썬(python) 해결 (0) | 2020.12.26 |