Algorithm/백준

[백준] 1002 터렛 with C++

nowkoes 2023. 7. 20. 17:32

문제설명


입출력 예제


개념

예제 입력 중 하나인 0 0 13 40 0 37에 대한 원 그래프

 

 이 문제는 원의 방정식을 이용하여 해결할 수 있다 된다. 즉, 조규현의 좌표에서 목표인 류재명까지의 거리를 반지름으로 하는 원과, 백승환의 좌표에서 목표까지의 거리를 반지름으로 하는 원을 그린 후, 두 원의 교점의 개수를 구하면 문제를 해결할 수 있다. 

 

 따라서 두 원의 교점의 개수를 구하는 관계를 파악하기 위해, 두 원 사이의 거리를 이용할 수 있다. 이는 교점이 2개, 1개, 0개, 무한개일 때로 나눌 수 있다. 이때 두 원의 반지름을 각각 r1, r2라고 하고, 두 원의 중점 사이의 거리를 d라고 할 때 다음이 성립한다.

 

  • 교점이 무한 개: d = 0
  • 교점이 0개: r1- r2 < d < r1 + r2
  • 교점이 1개: d = r1 ± r2
  • 교점이 2개: d < r1 + r2

 

 이 문제를 해결할 때 가장 주의해야 할 것은 교점의 관계를 파악할 때의 순서다. 주어진 문제에서 원의 겹침 상태와 교점 개수를 정확히 판단하기 위해, 겹치는 경우를 먼저 처리하고, 그다음으로 내접 또는 외접하는 경우, 마지막으로 겹치는 경우를 처리하는 것이 적절하다.

 

단지 if문의 순서만 바뀌었을 뿐인데, 틀렸다고 떴었다.


풀이

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
	int T, x1, y1, r1, x2, y2, r2;
	cin >> T;

	while (T--)
	{
		cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
		double d = sqrt(pow((x1 - x2), 2) + pow((y1 - y2), 2));

		if (d == 0 && r1 == r2)
			cout << -1;

		else if (d > r1 + r2 || d < abs(r1 - r2))
			cout << 0;

		else if (d == r1 + r2 || d == abs(r1 - r2))
			cout << 1;

		else if (d < r1 + r2)
			cout << 2;

		cout << "\n";
	}
}

 

반응형

'Algorithm > 백준' 카테고리의 다른 글

[백준] 1013 Contact With C++  (0) 2023.08.01
[백준] 1004 어린 왕자 with C++  (0) 2023.07.28
[백준] 1094 막대기 with C++  (0) 2023.07.04
[백준] 14725 개미굴 with C++  (0) 2023.06.29
[백준] 8979 올림픽 with C++  (0) 2023.06.25