알고리즘 문제 풀이/BOJ

[백준 1002] 터렛 - Python3

워킹자몽 2021. 1. 23. 21:49

[백준 1002] 터렛 - Python3

<문제>

- 두 좌표( [x1,y1], [x2,y2] ) 와 각 좌표에서 목표까지 떨어진 거리(r1, r2)가 주어졌을 때 목표가 존재할 수 있는 좌표의 개수를 출력하는 문제다.

 

<입력>

첫째 줄 : 테이스케이스 개수

한 줄에 x1, y1, r1, x2, y2, r2가 주어진다.

 

<출력>

주어진 좌표를 통해 목표가 존재할 수 있는 좌표의 개수를 출력한다. (무한대라면 -1을 출력)

 

 

<풀이>

(1)

처음엔 읽어보고 무슨 소리인가 싶었는데 문자를 차츰 하나씩 뜯어보면서 다시 생각해봤다.

'한 점(x1, y1)에서 r1만큼 떨어져 있다.'라는 문장을 보니 어쩐지 원이랑 연결될 것 같았다.

따라서 각 점과 거리를 기준으로 원을 그리고, 이 원들이 만나는 경우의 수를 생각해서 풀면 될 것 같았다.

그래서 경우의 수를 생각하고 손으로 그려보았다. (발로 그림 주의...)

여기서 d는 두 점([x1,y1], [x2,y2]) 사이의 거리이다.

(1) 두 점이 만날 때

 (a) 두 거리(r1,r2) 가 같을 때

 => 동일한 원이다. 점의 개수는 무한대

 (b) 두 거리가 다를 때

 => 원이 포함관계이다. 접점이 없다.

(2) 두 점이 다를 때

 (a) 두 점 사이 거리가 각 점에서의 거리보다 클 때

 => 두 원의 거리가 멀어서 접점이 없다.

 (b) 한 점에서의 거리가 나머지 점에서의 거리와 두 점 사이의 거리의 합보다 클 때

 => 원이 포함관계이기에 접점이 없다.

 (c) 한 점에서의 거리가 나머지 점에서의 거리와 두 점 사이의 합과 같을 때

 => 한 원이 다른 원에 내접한다. 접점은 1개다.

 (d) 두 점 사이의 거리와 각 점에서의 거리의 합이 같을 때

 => 두 원은 서로 외접한다. 접점은 1개다.

 (e) 두 원이 겹칠 때

 => 마지막 경우로 원이 서로 교집합을 형성한다면 접점은 2개다.

 

대충 이런 식으로 나뉜다. 이젠 이걸 코드로 옮기면 다음과 같다.

T=int(input())
for _ in range(T):
    x1,y1,r1,x2,y2,r2 = map(int,input().split())
    d = ((x1-x2)**2 + (y1-y2)**2) ** 0.5
    if x1==x2 and y1==y2:
        if r1==r2:
            print(-1)
        else:
            print(0)
        continue

    if r1 > d+r2 or r2 > d+r1 or d > r1+r2:
        print(0)
    elif r1==d+r2 or r2 == d+r1 or r1+r2 == d:
        print(1)
    else:
        print(2)

수학적인 문제라서 직접 그리면서 상황을 맞춰보니 쉽게 풀린 것 같다. 무작정 코딩하는 것보다 미리 생각해서 써보면서 하는 습관을 들이라는 교수님들의 말이 와 닿는다... 지금까진 수학적인 문제여도 일단은 코딩부터 하고 봤는데, 이러니까 시간이 더 단축되는 것 같다.

 

<풀이 인증>

 

문제 출처 : www.acmicpc.net/problem/1002