두 원의 중심 좌표와 반지름을 줄 때 교점의 개수를 구하는 문제이다. 겉보기에는 쉬운 문제이지만, 조건문을 짤 때 실수를 많이하는 문제이다. 조건문을 나눠줄 때 크게 두가지 경우로 나눈 뒤 세부적으로 들어가는 것이 좋을 것 같아서 두 원의 중심이 같을 때와 다를 때로 나누었다. 중심이 같을 때는 두 원이 일치하는 경우와 한 원이 다른 원을 포함할 때 두가지 경우가 있다. 중심이 다를 때는 밑의 사진의 경우 처럼 한 점에서 접하는 경우, 두 점에서 만나는 경우, 만나지 않는 경우로 나뉘는데,
한 점에서 접할 때는 (1) 각 반지름의 합이 좌표사이의 거리와 같을 때 (2) 각 반지름의 차가 좌표사이의 거리와 같을 때이다. 제곱근 계산의 번거로움 때문에 제곱을 한 값을 사용해서 비교를 해주면 되겠다.
두 점에서 만날 때는 (1)과 (2)에서 같을 때가 아닌 각각 클 때와 작을 때로 바꾸어 주면 된다.
만나지 않을 때는 그외의 경우로 처리해주면 된다.
##메인 함수 부분
if __name__ == "__main__":
T = int(input())
for _ in range(T):
x1, y1, r1, x2, y2, r2 = map(int,input().split())
d = ((x2 - x1)**2 +(y2-y1)**2)
ra = (r1 + r2)**2
rb = (r1 - r2)**2
if d == 0: #중심이 같을 때
if (r1 == r2):
print(-1) #한 원이 다른 원을 포함
else:
print(0)
else: #중심이 다를 때
if (d == ra) or (d == rb): #한 점만 겹칠 때
print(1)
elif((d < ra) and (d > rb)): #두 점이 겹칠 때
print(2)
else:
print(0)
어렵지 않은 문제지만, 조건문을 사용할 때 조금만 생각을 잘못하면 틀리는 문제였다. 기준을 잘 잡고 조건을 나누어 줘야 맞을 수 있는 문제였다. 거리 변수와 반지름의 합 변수를 선언하지 않으면 계산 중에 실수할 수 도 있으니 조심해야겠다.
'백준 문제풀이(파이썬) > 기본 수학 2' 카테고리의 다른 글
백준 9020번 - 골드바흐의 추측 (0) | 2021.05.26 |
---|---|
백준 4948번 - 베르트랑 공준 (Feat. 에라토스테네스의 체) (0) | 2021.05.26 |
백준 2581번 - 소수 (0) | 2021.05.26 |