Notice
Recent Posts
Recent Comments
Link
250x250
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

피너클의 it공부방

백준 1002 터렛 (c++) : 피너클 본문

백준

백준 1002 터렛 (c++) : 피너클

피너클 2022. 8. 17. 15:25
728x90
반응형

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

 

1002번: 터렛

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

www.acmicpc.net

기하학문제다.

터렛의 좌표와 거리가 주어졌을때 류재명이 있을수 있는 위치의 개수를 출력해야한다.

이때 크게 3가지 경우가 있다.

1. 두 터렛이 만나지 않는 경우

2. 두 터렛이 한번만 만나는 경우

3. 두 터렛이 두번 만나는 경우

int test;
cin >> test;
while (test-- > 0) {
	cin >> x_1 >> y_1 >> r_1 >> x_2 >> y_2 >> r_2;

	double dist = sqrt(pow(x_1 - x_2, 2) + pow(y_1 - y_2, 2));

test를 입력받고 while문을 돌린다.

터렛의 좌표와 거리를 입력받고 각 터렛끼리의 거리를 dist에 저장한다.

	if (dist == 0 && r_1 == r_2) cout << -1 << '\n';

만약 두 터렛의 좌표가 같고 (두 좌표의 거리가 0이고) 각 터렛의 류재명을 측정한 거리가 같다면 1을 출력한다.

	else if (dist < r_1 + r_2) {
		if (r_1 > r_2) swap(r_1, r_2);

		if (r_2 > dist + r_1) cout << 0 << '\n';
		else if (r_2 == dist + r_1) cout << 1 << '\n';
		else cout << 2 << '\n';
	}

만약 두 좌표의 거리보다 각 터렛이 류재명을 측정한 거리의 합이 크다면 기본적으로 맨위에서 3번째 상황인데 

3가지 경우로 나뉜다.

1. r_2가 dist + r_1보다 큰경우

위와 같은 경우다. 두 터렛의 경계가 닿지 않는걸 볼수 있다. 이런 경우엔 0을 출력한다.

2. r_2가 dist + r_1와 같은 경우

위와 같은 경우다. 두 터렛의 경계가 1번 닿는걸 알수 있다. 이런 경우엔 1을 출력한다.

3.  r_2가 dist + r_1와 작은 경우

위와 같은 경우다. 두 터렛의 경계가 2번 닿는걸 알수 있다. 이런 경우엔 2를 출력한다.

	else if (dist == r_1 + r_2) cout << 1 << '\n';
	else cout << 0 << '\n';

그후 dist가 r_1 + r_2와 같다면 맨 위의 2번째 상황이니 1을 출력하고

dist가 r_1 + r_2보다 작다면 맨 위의 1번째 상황이니 0을 출력한다.

#include <iostream>
#include <algorithm>
#include <math.h>

using namespace std;

double x_1, y_1, r_1, x_2, y_2, r_2;

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

	int test;
	cin >> test;
	while (test-- > 0) {
		cin >> x_1 >> y_1 >> r_1 >> x_2 >> y_2 >> r_2;

		double dist = sqrt(pow(x_1 - x_2, 2) + pow(y_1 - y_2, 2));
		if (dist == 0 && r_1 == r_2) cout << -1 << '\n';
		else if (dist < r_1 + r_2) {
			if (r_1 > r_2) swap(r_1, r_2);

			if (r_2 > dist + r_1) cout << 0 << '\n';
			else if (r_2 == dist + r_1) cout << 1 << '\n';
			else cout << 2 << '\n';
		}
		else if (dist == r_1 + r_2) cout << 1 << '\n';
		else cout << 0 << '\n';
	}
}

전체코드다.

728x90
반응형
Comments