ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 1002] 터렛 - Python3
    알고리즘 문제 풀이/BOJ 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

    댓글

Designed by Tistory.