[C++] 백준 1002 - 터렛

혜원·2022년 10월 16일
0

백준

목록 보기
11/25

백준 1002-터렛

문제

코드

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>

using namespace std;


int main() {
	cin.tie(NULL);
	cout.tie(NULL);
	ios::sync_with_stdio(false);

	// 같은 원 (단 r이 모두 0일경우 1)
	// 내접
	// 외접
	// 포함
	// 완전 떨어짐
	// 두점

	int t;
	int k = 0;
	int x1, y1, r1, x2, y2, r2;
	int dis; // 두좌표사이의 거리
	int rdis1, rdis2;

	cin >> t;

	while (k != t) {
		cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
		dis = pow(x1 - x2, 2) + pow(y1 - y2, 2);
		rdis1 = pow(r1 + r2, 2);
		rdis2 = pow(r1 - r2, 2);

		if (dis == 0 && r1 == 0 && r2 == 0) {
			cout << "1" << "\n";
		}
		else if (dis == 0 && r1 == r2) {
			cout << "-1" << "\n";
		}
		else if (dis == rdis2 || dis == rdis1) {
			cout << "1" << "\n";
		}

		else if (dis > rdis1 || dis < rdis2) {
			cout << "0" << "\n";
		}
		else {
			cout << "2" << "\n";
		}
		k++;
	}

}

해설

이 문제는 두 원이 있을 때 몇 개의 점에서 만날 수 있는지 묻는 문제이다.
두 좌표는 원의 중심이며, r1, r2는 반지름이다.

따라서 이 문제를 같은 원인 경우(-1), 좌표는 같지만 반지름이 0인경우(1), 내접/외접인 경우(1), 만나지 않는 경우(포함하거나 완전히 떨어져있는 경우)(0), 일부 만나는 경우(2) 로 나누어서 문제를 해결했다.

dis (두 좌표의 거리의 제곱) 와 rdis1(두 반지름을 더한것의 제곱), rdis2(두 반지름의 차이의 제곱) 을 비교해서 두 원이 몇개의 점에서 만나는지를 알아내었다.

profile
안녕하세요

0개의 댓글