https://www.acmicpc.net/problem/1002
조규현과 백승환의 좌표가 있을 때, 적과의 거리가 주어지고, 교점을 구하라는 뜻이다.
거리가 주어지고, 원의 정의 자체가 어떤 한 점으로부터 거리가 일정한 점의 집합이기에 원이라는 것을 알아냈다.
즉 두 원이 있고 그 원들의 교점을 구하면 되는 문제이다.
학창 시절에 내접원, 외접원 등등을 배운 기억이 날 것이다.
코드를 보며 좀 더 케이스 분류 해보자.
#include <bits/stdc++.h>
using namespace std;
int main()
{
std::cin.tie(NULL);
std::cout.tie(NULL);
std::ios::sync_with_stdio(false);
int test_case;
int x1, y1, x2, y2, r1, r2;
cin >> test_case;
while (test_case--)
{
cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
int result = 0;
double d = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
int c = r1 + r2;
int small_r = r1 > r2 ? r2 : r1;
int big_r = r1 < r2 ? r2 : r1;
if (d > c)
result = 0;
else if (d == c)
result = 1;
else if (d < c)
{
if (r1 == r2 && x1 == x2 && y1 == y2)
result = -1;
else if (d + small_r > big_r)
result = 2;
else if (d + small_r == big_r)
result = 1;
else if (d + small_r < big_r)
result = 0;
}
cout << result << '\n';
}
return 0;
}
d 는 두 점 사이의 거리이다.
그리고 두 반지름의 길이의 합을 c라고 가정했을 때
두 점 사이의 거리가 반지름의 합보다 크다면(d > c) 두 원의 교점은 없다.
두 점 사이의 거리가 반지름의 합과 같다면 교점은 하나이다.
두 점 사이의 거리가 반지름의 합보다 작다면 이제 케이스가 여러가지다.
1. 만약 두 점이 같다면 같은 원이고 이런 경우 무한대이므로 -1 출력
2.
'백준 문제풀이 > 실버3' 카테고리의 다른 글
백준 15353번 - 큰 수 A+B(2) (0) | 2022.08.25 |
---|---|
백준 3273번 - 두 수의 합 (0) | 2022.08.18 |
백준 1388 - 바닥 장식 (0) | 2022.08.04 |
백준 11659번 - 구간 합 구하기 4 (0) | 2022.08.04 |
백준 1213번 - 팰린드롬 만들기 (0) | 2022.07.05 |