본문 바로가기
알고리즘 테스트/백준

백준 1002 : 터렛 (파이썬)

by codeyaki 2022. 1. 26.
반응형

터렛


코드

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가지가 존재한다.

  1. 교점이 무한대인 경우
    두원이 완전히 겹칠 경우다. 즉, d가 0이며 r1과 r2가 같은 경우다. (d == 0 and r1 == r2)
  2. 교점이 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)
  3. 교점이 1개인 경우
    내접, 외접하는 경우
    3.1) 외접하는 경우 : r1+r2가 d와 같을 때 발생
    3.2) 내접하는 경우 : |r1-r2|가 d와 같을 때 발생
  4. 교점이 2개인 경우
    r1+r2가 d보다 크고 |r1-r2|는 d보다 작을 때 발생

이를 정리하면

 

1. 동심원인 경우에는 두원의 반지름이 같으면 무한대, 두 반지름이 다르면 0개의 교점을 갖고

2. 동심원이 아닌 경우에는 아래 사진과 같이 정리가 된다.

이걸 토대로 코드를 짜면 된다!

반응형