티스토리 뷰

Computer/백준 풀이

[파이썬/백준1002/힌트] 터렛

벼랑끝과학자 2022. 12. 27. 12:03

 

https://www.acmicpc.net/problem/1002

 

1002번: 터렛

각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.

www.acmicpc.net

실버 3 문제이지만 정답비율 22%로 꽤나 사람들을 괴롭히는 문제같다.

개인적으로 기하학 문제들을 푸느냐 풀지 못하느냐는 이것에 달려있는 것 같다.

문제가 의도하는 바를 캐치해냈는가?

 

이 문제도 처음 봤을때는 이게 도대체 무슨소리인가? 싶었고 그림으로 그려보려 했지만 한시간정도 막막하게 이게 도대체 뭐지? 라는 생각에 사로잡힌채로 두려움에 떨고있었지만 문제의 의도를 파악한 순간 정답은 그냥 자동으로 알게 되는 문제였다. 

먼저 힌트부터 보고 다시 한번 스스로 풀어보자, 그냥 남이 적어놓은 정답을 보고 푸는건 아무 의미가 없다. 힌트는 눌러야 열리니 하나씩 확인하고 도전해볼 것

더보기

문제가 의도하는 바를 파악하자! (x1, y1) (x2, y2) 그리고 r1, r2 ... 고등학교때 분명 무언가를 구하기 위한 식으로 많이 사용했던 기억이 여러분의 전두엽 어딘가에 남아있을 것이다!

 

아직 모르겠는가? 결정적인 힌트를 하나 더 들어보자

더보기

이 문제에서 요구하는 바는 '원'에 대한 것이다.

 

여기까지 힌트를 봤다면 문제를 풀 수 있어야 한다고 생각한다.

 

 

이 문제는 원의 접점을 묻는 문제였다.

내가 작성한 정답 코드는 아래와 같았다. 그러나 머리 속에 원의 접점에 대한 조건이 전부 남아있지는 않았기에 구글링을 통해 참고를 하며 문제를 풀 수 밖에 없었다. 아래 블로그의 원의 접점 설명을 참고했다.

https://mathbang.net/101 

from math import sqrt

T = int(input())
A = []

for i in range(T):
    x1, y1, r1, x2, y2, r2 = map(int, input().split())
    d = sqrt((x2-x1)**2+(y2-y1)**2)
    
    if (x1 == x2) and (y1 == y2):
        if r1 == r2:
            A.append(-1) # 완전히 일치 (7)
        else:
            A.append(0) # 두 원의 중점이 같은데 반지름이 다른경우 (6)
    else:
        if (d > abs(r1-r2)) and (d < abs(r1+r2)): # 원이 두개의 접점을 갖는경우 (1)
            A.append(2)
        elif (d == abs(r1+r2)) or (d == abs(r1-r2)): # 원의 외접(2) 또는 원의 내접(3) 
            A.append(1)
        elif d > abs(r1+r2): # 두 원중 하나가 나머지 하나를 포함하지 않으면서 맞닿지 않는 경우 (4)
            A.append(0)
        elif d < abs(r1-r2): # 두 원중 하나가 나머지 하나를 포함하면서 맞닿지 않는 경우 (5)
            A.append(0)
        else:
            pass

for i in A:
    print(i)
댓글