For Programmer
백준 1002번 파이썬 문제풀이(기본수학2 - 터렛) 본문
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 : 두 원이 두 점에서 만나는 경우
위 세 가지 경우가 아닌 경우
728x90
'코팅테스트 > 백준 문제 모음' 카테고리의 다른 글
백준 2447번 파이썬 문제풀이(재귀 - 별 찍기 - 10) (0) | 2021.10.05 |
---|---|
백준 10870번 파이썬 문제풀이(재귀 - 피보나치 수5) (0) | 2021.10.05 |
백준 3053번 파이썬 문제풀이(기본수학2 - 택시 기하학) + 소수점 출력 in 파이썬 (0) | 2021.10.04 |
백준 4153번 파이썬 문제풀이(기본수학2 - 직각삼각형) (0) | 2021.10.04 |
백준 3009번 파이썬 문제풀이(기본수학2 - 네번째 점) (0) | 2021.10.04 |
Comments