맨땅에 코딩

백준 1002번: 터렛 / C++ 본문

코딩 낙서장

백준 1002번: 터렛 / C++

나는 푸딩 2024. 7. 9. 00:17

어떤 문제일까?

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

 

문제에서 조규현과 백승환의 위치가 좌표 (𝑥1, 𝑦1),  (𝑥2, 𝑦2)로 주어지고, 그로부터 류재명과의 거리가  𝑟1𝑟2로 주어지며, 예제 출력의 형태가 2, 1, 0이라는 것을 우리가 직관적으로 봤을 때, 두 원의 교점의 개수를 구하는 문제와 같다는 것을 알 수 있다.

 

두 원의 교점의 개수 구하기

경우의 수는 총 4가지로, 다음과 같다.

 

문제에서 주어지는 A (𝑥1, 𝑦1),  B(𝑥2, 𝑦2), 𝑟1, 𝑟2를 기준으로 설명하겠다.

A와 B 두 점 사이의 거리를 D라고 하겠다.

 

1. 두 점에서 만난다.

D < 𝑟1 + 𝑟2

 

2. 한 점에서 접한다.

D = 𝑟1 + 𝑟2 또는 D = | 𝑟1 - 𝑟2 |

 

3. 만나지 않는다.

D > 𝑟1 + 𝑟2 또는 D = | 𝑟1 - 𝑟2 |

 

4. 무수히 많은 점에서 만난다.

𝑟1 = 𝑟2 이고, D = 0

 

해결

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

int main() {
	int x1, y1, x2, y2, r1, r2, t;
	cin >> t;
	for (int i = 0; i < t; i++) {
		cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
		
		double d = sqrt(pow(x1-x2, 2) + pow(y1-y2, 2));

		int add = r1 + r2;
		int sub = r1 - r2 > 0 ? (r1 - r2) : (-1) * (r1 - r2);

		if (r1 == r2 && d == 0) {
			cout << -1 << '\n';
		}

		else if (d > add || d < sub) {
			cout << 0 << '\n';
		}

		else if (d == add || d == sub) {
			cout << 1 << '\n';
		}

		else if (d < add) {
			cout << 2 << '\n';
		}
		
	}
	return 0;
}

 

'코딩 낙서장' 카테고리의 다른 글

백준 1003번: 피보나치 함수 / C++  (0) 2024.07.09
Git commit History 초기화, 삭제하는 법  (0) 2024.06.10