백준 1002 터렛 개념 및 풀이 (C++)

2125 단어 백준백준

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

기본적인 접근

문제는 두개의 터렛이 특정 타겟의 위치 r1, r2를 알았을 때 그 타켓의 해의 수를 구하는 것이 문제의 핵심이다.

단순히 2차원 좌표계에서 2개의 (2차원이기 때문에)기준 지점에서의 특정 지점의 거리를 알면 그 지점의 위치를 정확히 계산할 수 있다고 알고있다. 대표적인 예로 3차원 좌표계에서의 3개의 기준 지점에서 특정 지점을 파악하는 GPS의 원리를 들 수 있다.

그렇다면 왜 해가 여러가지의 종류가 나오는 것일까?
간단히 설명하기 위해 구글에서 두 원의 위치 관계에 대해 직관적으로 잘 정리한 이미지가 있어 가져와 본다.

사실 이정도만 해도 왜 해의 개수가 여러개가 나오는지는 파악을 했을 것이다. 결국두 원의 중심으로부터의 거리과 각각의 원의 반지름에 따라 교점의 개수가 달라진다. 터렛 문제는 주어진 두 원의 좌표와 반지를 을 이용한 교점 개수를 구하는 수학문제와 일맥상통하다.

코드

#include <math.h>
using namespace std;


class Circle {
public:
	float x;
	float y;
	float r;
	Circle(float x, float y, float r) {
		this->x = x;
		this->y = y;
		this->r = r;
	}
};

float getDistance(Circle& c1, Circle& c2) {
	return sqrt(pow(c1.x - c2.x, 2) + pow(c1.y - c2.y, 2));
}

int checkIntersection(Circle c1, Circle c2) {
	float dis = getDistance(c1, c2);

	if (dis == 0 && c1.r == c2.r) {
		return -1;
	}
	else if (dis < abs(c1.r - c2.r)) {
		return 0;
	}
	else if (dis == abs(c1.r - c2.r)) {
		return 1;
	}

	else if (dis < c1.r + c2.r) {
		return 2;
	}
	else if (dis == c1.r + c2.r) {
		return 1;
	}

	else if (dis > c1.r + c2.r) {
		return 0;
	}

}


int main() {
	int count;
	float x1, y1, r1, x2, y2, r2;
	cin >> count;
	int* ansArr = new int[count];
	int i = 0;

	while (i != count) {
		cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
		Circle a(x1, y1, r1), b(x2, y2, r2);

		ansArr[i] = checkIntersection(a, b);
		i++;
	}

	i = 0;
	while (i != count) {
		cout << ansArr[i] << endl;
		i++;
	}
	return 0;
}

마치며

아직 아는 것이 부족하고 경험도 부족하지만 하루하루의 내가 모여 더나은 내가 될 수 있기를 바라며 꾸준히 글을 써보도록 하자.

좋은 웹페이지 즐겨찾기