https://www.acmicpc.net/problem/1002
이 문제는 원에 대해서 알아야 쉽게 풀 수 있는 문제이다.
원에 대해 알아보며 코드를 작성해보자
두 점 사이의 거리 공식
Python Code
distance = (x2 - x1)**2 + (y2 - y1)**2
distance = math.sqrt(distance)
두 원의 위치 관계
1. 만나지 않는 경우
- 외부에서 만나지 않음
- r1 + r2 < d 인 경우
- 내부에 포함
- r1 - r2 > d인 경우
- 동심원
- d == 0 인 경우
코드를 작성해보면 다음과 같다
Python Code
elif r1 + r2 < distance or abs(r2-r1) > distance or distance == 0:
# 두 원이 서로 밖에 있으면 만나지 않을때 / 다른 원의 내부에 있으면 만나지 않는다. / 동심원인 경우
print(0)
2. 접하는 경우(한 점에서 만나는 경우)
- 외접
- r1 + r2 = d
- 내접
- r1 - r2 = d or r2 - r1 = 0
Python Code
elif r1 + r2 == distance or abs(r2-r1) == distance:
# 두원이 외접할때 or 내접할때
print(1)
3. 두 점에서 만나는 경우
- r1 - r2 < d < r1 - r2
Python Code
elif abs(r2-r1) < distance < abs(r2+r1):
print(2)
마지막으로 문제에서 조건이 하나 더 있었는데
" 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우 -1을 출력한다"
이 의미는 서로 x,y 좌표가 같고 반지름또한 같으면 원이 겹치게 된다. 코드로 표현하면 다음과 같다.
if x1 == x2 and y1 == y2 and r1 == r2:
print(-1)
전체코드
input = sys.stdin.readline
n = int(input())
for case in range(n):
x1, y1, r1, x2, y2, r2 = map(int, input().split())
distance = (x2 - x1)**2 + (y2 - y1)**2
distance = math.sqrt(distance)
if x1 == x2 and y1 == y2 and r1 == r2:
print(-1)
elif r1 + r2 < distance or abs(r2-r1) > distance or distance == 0:
# 두 원이 서로 밖에 있으면 만나지 않을때 / 다른 원의 내부에 있으면 만나지 않는다. / 동심원인 경우
print(0)
elif r1 + r2 == distance or abs(r2-r1) == distance:
# 두원이 외접할때 or 내접할때
print(1)
elif abs(r2-r1) < distance < abs(r2+r1):
print(2)
- abs를 사용한 이유 : 입력받는 반지름이 r1이 큰지 r2가 큰지 모르기 때문에 abs로 절댓값을 사용한다. 반지름은 0보다 항상 큰 값을 가진다는 것도 명심해둘것
'코딩테스트 > 백준' 카테고리의 다른 글
[Python/Java] 백준1012번. 유기농 배추 (0) | 2024.02.19 |
---|---|
[Python] 백준1011. Fly me to the Alpha Centauri (1) | 2024.01.23 |
[Python] 백준 2667번. 단지번호 붙이기 (0) | 2024.01.18 |
[Python] 백준 15650번. N과 M(2) (0) | 2023.12.26 |
[Python] 백준 12015번. 가장 긴 증가하는 부분 수열2 (0) | 2023.12.19 |