본문 바로가기
작업/Problem Solving

백준 1002(터렛) 파이썬(python) 해결

728x90

문제

조규현의 좌표 (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을 출력한다.

 


수학에서 원의 내접과 외접을 이해하면 해결할 수 있는 문제입니다.

수학 지식이 부족했기 때문에 공부하고 왔습니다...★

 

 

https://mathbang.net/101

 

두 원의 위치관계, 내접, 외접

위치관계 또 나오네요. 이번에는 두 원의 위치관계에요. 위치관계 마지막이니까 정신 바짝 차리고 따라오세요. 원과 직선의 위치관계, 원의 할선과 접선, 접점에서 했던 것처럼 두 원이 어떤 관

mathbang.net

 

 

결과를 구하기 위해서는 두 좌표( (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()를 통해 값을 일치시켰습니다.

 

 

- 끝 - 

 

 

 

 

728x90