[C++]백준1002번 터렛

1 minute read

오늘은 백준1002번 터렛 문제를 풀어보도록 하자.

정답률이 20%일 정도로 매우 저조한데 예외처리의 문제와 자료형의 비교에서 많은 사람들이 틀렸던 것 같다.

케이스는 크게 3개로 나누고 각각의 케이스 안에서 또 3가지의 케이스로 나누면 되는 문제였다.

문제는 다음과 같다.

                               [접근법]
                              
                                주석 참고
                                     [코드]
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;

int N, x_1, y_1, r_1, x_2, y_2, r_2;

int main() {
	cin >> N;

	while (N--) {
		cin >> x_1 >> y_1 >> r_1 >> x_2 >> y_2 >> r_2;

		if (x_1 == x_2 && y_1 == y_2 && r_1 == r_2) {//겹칠 때
			cout << -1 << '\n';
			continue;
		}

		if (r_1 + r_2 > sqrt(pow(abs(x_1 - x_2), 2) + pow(abs(y_1 - y_2), 2))) { // 반지름 합 > 중심사이거리
			if (sqrt(pow(abs(x_1 - x_2), 2) + pow(abs(y_1 - y_2), 2)) + min(r_1, r_2) == max(r_1, r_2)) {//내접
				cout << 1 << '\n';
			}
			else if (sqrt(pow(abs(x_1 - x_2), 2) + pow(abs(y_1 - y_2), 2)) + min(r_1, r_2) < max(r_1, r_2)) {//내부에서 안 만남
				cout << 0 << '\n';
			}
			else {
				cout << 2 << '\n';
			}
		}
		else if (r_1 + r_2 < sqrt(pow(abs(x_1 - x_2), 2) + pow(abs(y_1 - y_2), 2))) {// 반지름 합 < 중심사이거리
			cout << 0 << '\n';
		}
		else { // 반지름 합 == 중심사이거리
			cout << 1 << '\n';
		}
	}
}