문제: https://www.acmicpc.net/problem/1002
Hint
위 문제는 기하학으로 분류되어 있으며
기하학과 관련된 풀이를 진행하면 쉽다.
또한 좌표와 거리가 주어진 것으로 보아
원의 위치 관계를 생각해보면 된다.
Solution
해결책은
원의 위치 관계에 대한 경우의 수를
생각하면 된다
여기서 dist는 distance의 약자로
원의 중심 사이의 거리를 나타냈다
1) 원이 접하는 경우
외접하는 경우와 내접하는 경우가 있다
2) 원이 만나지 않는 경우
두 번째 사진과 세 번째 사진은 거의 동일하지만
내 코드에서는 서로 다른 경우로 나눴다
3) 원이 겹치는 경우
두 경우가 있다
완전 겹치는 경우와 두 점이 겹치는 경우
겹치는 경우는 이 두가지 경우밖에 없다.
내 코드에서는 위 경우와 조금 다르게 생각해봤다.
T = int(input())
for i in range(T):
A=list(map(int,input().split()))
dist = ((A[0]-A[3])**2 + (A[1]-A[4])**2)**(1/2)
if dist == 0:
if A[2]==A[5]:
print(-1)
else:
print(0)
elif dist < abs(A[2]-A[5]):
print(0)
elif dist == abs(A[2]-A[5]):
print(1)
elif A[2]+A[5] < dist:
print(0)
elif A[2]+A[5] == dist:
print(1)
else:
print(2)
먼저 공백으로 나뉜 입력들을 리스트로 저장하였다.
A[0]=x1, A[1]=y1, A[2]=r1, A[3]=x2, A[4]=y2, A[5]=r2로 저장될 것이고
dist를 구하는 것은 점과 점 사이의 거리를 구하는 공식을 대입한 것이다
if dist == 0:
if A[2]==A[5]:
print(-1)
else:
print(0)
dist가 0인 경우를 먼저 생각했다.
dist가 0이란 것은 원의 중심이 서로 겹친다는 것
여기서 원의 반지름이 다르다면 서로 만나지 않는 것으로 0 출력
반지름이 같다면 완전히 겹치는 것으로 -1 출력
elif dist < abs(A[2]-A[5]):
print(0)
elif dist == abs(A[2]-A[5]):
print(1)
두 번째로는
원의 반지름의 차이와 dist와의 관계반지름의 차이가 dist보다 크다면한 원 안에 다른 원이 있지만 만나지 못하는 경우이다.
그리고 dist와 반지름의 차이가 같다면한 원과 다른 원이 내접하는 것이다.
여기서 dist=0 인 경우는 위에서 제거해줬기 때문에두 원의 중심의 위치는 다르며반지름이 같거나 차이가 dist보다 작다면 다른 경우에 해당한다
elif A[2]+A[5] < dist:
print(0)
elif A[2]+A[5] == dist:
print(1)
else:
print(2)
마지막이다원의 중심 사이 거리가 반지름의 합보다 크다면
두 원은 만날 수 없다 (2-1 그림 참고)
중심 사이의 거리와 반지름의 합이 같다면
두 원은 접하는 것이다(1-1 그림 참고)
마지막으로 이외의 모든 경우는
원과 원이 두 점에서 만난다.
아까 위에서 걸러주지 못한| r2-r1 | < dist는
만약 r1+r2가 dist보다 크거나 같다면 자동으로 걸러진다.
즉| r2-r1 | < dist 이면서 r1+r2 > dist인 경우만
else로 나올 수 있다.
'백준(BOJ)' 카테고리의 다른 글
[백준] 2579번 문제 풀이 : 파이썬(python) 코드 설명 (0) | 2021.02.17 |
---|---|
[백준] 3053번 문제 풀이 : 파이썬(python) 코드 설명 (0) | 2021.02.09 |
[백준] 1065번 문제 풀이 : 파이썬(python) 코드 설명 (0) | 2021.02.05 |
[백준] 9012번 문제 풀이 : 파이썬(python) 코드 설명 (0) | 2021.02.04 |
[백준] 1003번 문제 풀이: 파이썬(python) 코드 설명 (0) | 2021.02.03 |