Koala - 13기/코딩테스트 준비 스터디

[백준/C++] 1002번: 터렛

나는 푸딩 2024. 2. 16. 21:35

고등학교때 배웠던 원의 방정식을 활용하여 문제를 해결하였다.

두 원의 위치와 반지름이 주어졌을 때, 두 원이 서로 교차하는지, 접하는지, 겹치는지, 아니면 아무 관계도 없는지를 판별하는 프로그램을 구현하면 된다.

  1. 테스트 케이스의 수를 입력받는다.
  2. 각 테스트 케이스마다 두 원의 중심 좌표와 반지름을 입력받는다.
  3. 두 원의 중심 사이의 거리를 계산한다.
  4. 두 원의 반지름의 차이를 계산한다.
  5. 두 원의 관계를 판별하고 결과를 출력한다.

결과값(res)은 다음과 같이 설정한다.

  • -1: 두 원이 동심원이고 반지름이 같은 경우
  • 0: 두 원이 아무 관계도 없는 경우
  • 1: 두 원이 서로 교차하거나 한 원이 다른 원을 포함하는 경우
  • 2: 두 원이 서로 접하는 경우

즉, 두 원의 중심 사이의 거리를 계산한 뒤, 각 원의 반지름을 기반으로 두 원이 교차하는지, 접하는지, 겹치는지 여부를 판단한다. 여러 조건문을 통해 각 경우에 해당하는 결과를 출력한다.

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

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

	int t, x1, y1, r1, x2, y2, r2, res;
	double dist, sub;

	cin >> t;

	for (int i = 0; i < t; i++) {
		cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
		dist = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));
		sub = r1 > r2 ? r1 - r2 : r2 - r1;

		if (dist == 0 && r1 == r2) {
			res = -1;
		}
		else if (dist < r1 + r2 && (sub < dist)) {
			res = 2;
		}
		else if (dist == r1 + r2 || dist == sub) {
			res = 1;
		}

		else {
			res = 0;
		}

		cout << res << '\n';
	}
}

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