Eat the ENAK
BOJ1002 - 터렛 본문
문제 바로가기
https://www.acmicpc.net/problem/1002
Solved.ac* 난이도
* Solved.ac는 백준 온라인 저지의 문제들에 난이도를 매겨주는 서비스입니다. 자세한 내용은 홈페이지를 참고해주세요.
본문
해설
https://github.com/return0927/CodingWrite-UP/blob/master/BOJ/1002/1002.py
처음에 문제를 제대로 안 읽고 두 원의 교점 좌표를 구하라는줄 알고 방정식 3개를 연산하다가 아 이건 아닌거같은데.. 하면서 다시 보니 교점 개수를 구하는거라 카더라,,
학창시절에 배웠을법한 두 원의 위치관계를 떠올리며 케이스를 고려하면 쉽게 풀 수 있는 문제다. 원의 두 중심 사이 거리와 반지름의 길이를 이용해 두 원의 위치관계를 생각해보면 된다.
따라서 아래의 단계를 따라 모든 경우를 고려할 수 있다.
1. 원의 중심이 일치하는 경우 (\(d=0\))
\(x_1 = x_2, y_1 = y_2\)일 때, \(r_1 = r_2\)이면 교점은 무수히 많고(\(-1\)), \(r_1 \ne r_2\)이면 교점은 없다(\(0\)).
2. 원의 중심이 떨어져있는 경우 (\(d\ne0\))
2.1. 두 원이 접하는 경우
두 원이 \(r_1 + r_2 = d\)이면 외접, \(|r_1 - r_2| = d\)이면 내접하기 때문에 교점은 1개이다.
2.2. 두 점에서 만나는 경우
\(|r_1 - r_2| < d < r_1 + r_2\)이면 두 원은 두개의 교점을 갖는다.
2.3. 그렇지 않은 경우
교점이 없다
# 만약 중심이 같다면
if x1 == x2 and y1 == y2:
if r1 == r2: # 반지름도 같다면 무수히 많다
print(-1)
else: # 반지름이 다르면 교점이 하나도 없다
print(0)
else: # 중심이 다르다면
# 거리에 따라 조건이 달라지지
distance = ((x1 - x2)**2 + (y1 - y2)**2)**.5
if r1 + r2 == distance or abs(r1 - r2) == distance:
print(1)
elif abs(r1 - r2) < distance < r1 + r2:
print(2)
else:
print(0)
'PS: Problem Solving > BOJ: 백준온라인저지' 카테고리의 다른 글
BOJ3009 - 네 번째 점 (0) | 2019.10.29 |
---|---|
BOJ4153 - 직각삼각형 (0) | 2019.10.28 |
BOJ3053 - 택시 기하학 (0) | 2019.10.28 |
BOJ2869 - 달팽이는 올라가고 싶다 (0) | 2019.10.26 |
BOJ1193 분수찾기 (0) | 2019.10.26 |