백준 문제풀이/실버3

백준 1002번 - 터렛

void_melody 2022. 8. 18. 22:52

https://www.acmicpc.net/problem/1002

 

1002번: 터렛

각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.

www.acmicpc.net

조규현과 백승환의 좌표가 있을 때, 적과의 거리가 주어지고, 교점을 구하라는 뜻이다.

거리가 주어지고, 원의 정의 자체가 어떤 한 점으로부터 거리가 일정한 점의 집합이기에 원이라는 것을 알아냈다.

즉 두 원이 있고 그 원들의 교점을 구하면 되는 문제이다.

 

학창 시절에 내접원, 외접원 등등을 배운 기억이 날 것이다.

코드를 보며 좀 더 케이스 분류 해보자.

 

#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.