For Programmer

백준 1002번 파이썬 문제풀이(기본수학2 - 터렛) 본문

코팅테스트/백준 문제 모음

백준 1002번 파이썬 문제풀이(기본수학2 - 터렛)

유지광이 2021. 10. 4. 15:09
728x90

나의 코드

import math

t = int(input())

for _ in range(t):
    x1, y1, r1, x2, y2, r2 = map(int, input().split())
    distance = math.sqrt((x1-x2)**2 + (y1-y2)**2) #두 원 사이의 거리계산

    array1 =[] #두 점에서 마린과의 거리 및 두점사이의 거리를 담을 리스트 선언
    array1.append(r1),array1.append(r2),array1.append(distance) 
    maxNum = max(array1) #3거리중 최대값을 다른 변수에 대입
    array1.remove(maxNum) #최대값을 리스트에서 제외하기(두 원이 만나지 않는 경우 계산에 필요하기 때문)

    if distance == 0 and r1 == r2 :  # 두 원이 동심원이고 반지름이 같을 때(두 원이 일치)
        print(-1)
    elif abs(r1-r2) == distance or r1 + r2 == distance:  # 두 원이 내접, 외접일 때
        print(1)
    elif abs(r1-r2) < distance < (r1+r2) :  # 두 원이 서로다른 두 점에서 만날 때
        print(2)
    elif maxNum > array1[0]+array1[1]: # 두 원이 만나지 않는 경우(두원이 외접하지않고 외부에 있거나 
    #하나의 원이 나머지 원 내부에 있는 경우)
        print(0)

-> 개인적으로 풀면서 원으로 풀어야한다는 생각을 못하면 굉장히 어려운 문제이다. 또한 원으로 푸는것을 알아도 각각의 경우의 수마다 조건을 위처럼 깔끔하게 생각해 내는 것이 쉽지는 않다. 특히 위 3번째 4번째 조건 ( 두 원이 서로다른 두 점에서 만날 때와 두 원이 만나지 않는 경우)는 정말로 생각해 내는 것이 쉽지않다..

이것을 답을 안보고 푸신분이 있다면 정말 리스펙 한다....

 

총 네 가지 경우의 수가 있다. (두 원의 중점 사이의 거리를 r이라 하자.)

 

-1 : 두 원이 일치하는 경우

r==0 & r1==r2

 

 

1 : 두 원이 한 점에서 만나는 경우 (외접, 내접)

(r == r1 + r2) or (r2 == r + r1)

 

 

0 : 두 원이 만나지 않는 경우

r, r1, r2 중 가장 긴 값이 나머지 두 값의 합 보다 큰 경우

 

 

2 : 두 원이 두 점에서 만나는 경우

위 세 가지 경우가 아닌 경우

 

출처:https://leedakyeong.tistory.com/entry/%EB%B0%B1%EC%A4%80-1002%EB%B2%88-%ED%84%B0%EB%A0%9B-in-python-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%BD%94%EB%93%9C-%EB%B0%8F-%EC%84%A4%EB%AA%85

 

 

728x90
Comments