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

 

1002번: 터렛

각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 $-1$ 출력한다.

www.acmicpc.net

두 점의 좌표가 주어지고, 각각의 점으로부터 r1, r2만큼의 거리에 있는 상대의 위치를 찾는 문제이다. 있을 수 있는 곳을 찾는 것이기 때문에 여러가지 경우가 생긴다.  따라서 원으로 그리면 편하다. 결국 두 원의 접점이 몇개인지를 찾는 문제이다.

#include <iostream>
#include <cmath>

using namespace std;

int main() {
	int n, x1, y1, r1, x2, y2, r2;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
		double d = sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));
		if (x1 == x2 && y1 == y2) {
			if (r1 == r2) {
				cout << -1<<endl;
			}
			else {
				cout << 0<<endl;
			}
		}
		else {
			if (d > r1 + r2 || d < sqrt(pow(r2 - r1, 2))) {
				cout << 0<<endl;
			}
			else if (d + r1 == r2 || d + r2 == r1 || d == r1 + r2) {
				cout << 1<<endl;
			}

			else {
				cout << 2<<endl;
			}
		}
		
	}
}

두 원의 중심점이 일치하는 경우에는 반지름(r)이 같은지에 따라서 점점이 무한대일수도, 0개일수도 있기에 먼저 예외처리를 해주었다.

두 원의 반지름의 합이 두 원의 중심점 거리보다 짧을 경우나 중심점 거리와 한 원의 반지름의 합이 다른 원의 반지름보다 짧은 경우 0개의 접점, 반지름의 합이 거리와 같을 경우와 원 안에서 접할 경우 1개의 접점, 그 외의 경우 2개의 접점을 출력하도록 구현해주었다.

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

백준 1052번 - 물병  (0) 2024.01.19
백준 1074번 - Z  (0) 2023.07.25
백준 1291번 - 이면수와 임현수  (0) 2023.07.24
백준 1051번 - 숫자 정사각형  (0) 2023.07.21
백준 2108번 - 통계학  (0) 2023.07.21

+ Recent posts