Write-up/백준

백준 1002번 - 터렛

da1seun9 2021. 1. 10. 20:42

문제

풀이

이 문제는 크게 4가지의 경우로 나뉜다.

  1. 두개의 원이 두 점에 접할 경우(2)
  2. 두개의 원이 한 점에 접할 경우(1)
  3. 두개의 원이 접하지 않을 경우(0)
  4. 두개의 원이 같을 경우(∞)

1. 두개의 원이 두 점에 접할 경우

문제에 나와있는 예제 입력을 가지고 그래프를 그릴 수 있다.

이렇게 두 원점 사이의 거리(distance)가 두 원의 반지름 길이의 합(radius)보다 짧을때 두개의 원이 두 점에 접할 수 있다.

2. 두개의 원이 한점에 접할 경우

  1. 외접할 때

두 원점 사이의 거리(distance)이 한 원의 반지름(r1) + 다른 원의 반지름(r2)일 경우 외접하면서 두개의 원이 한 점에 접한다.

  1. 내접할 때

두 원점 사이의 거리(distance) + 한 원의 반지름 = 다른 원의 반지름일 경우 내접하면서 두개의 원이 한 점에 접한다.

두개의 원이 접하지 않을 경우

  1. 원이 안에 있을 경우

2. 원이 바깥에 있을 경우

 

 

두 원이 같을 경우

겹치는 점이 무한이다.

코딩

case = int(input())

for i in range(case):
    x1, y1, r1, x2, y2, r2 = map(int,input().split())
    radius = r1 + r2
    distance = (((x1 - x2)**2) + ((y1 - y2)**2))**0.5

    if x1 == x2 and y1 == y2:
        if r1 == r2:
            print(-1)
        else:
            print(0)
        continue
    elif distance > radius or distance + r1 < r2 or distance + r2 < r1:
        print(0)
    elif distance == radius or distance + r1 == r2 or distance + r2 == r1:
        print(1)
    else:
        print(2)

수학을 손 놓은지 좀 되서 그런지 예상 외로 경우의 수가 좀 많아서 시간도 좀 걸렸고 코딩이 점점 길어졌다.

이상한 객기부리지 말고 파이썬 모듈을 쓰면 훨씬 간단하게 할 수 있으므로 모듈쓰는 걸 추천한다.