백준 1002 터렛 개념 및 풀이 (C++)
기본적인 접근
문제는 두개의 터렛이 특정 타겟의 위치 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;
}
마치며
아직 아는 것이 부족하고 경험도 부족하지만 하루하루의 내가 모여 더나은 내가 될 수 있기를 바라며 꾸준히 글을 써보도록 하자.
Author And Source
이 문제에 관하여(백준 1002 터렛 개념 및 풀이 (C++)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kdhangelic/백준-1002-터렛-개념-및-풀이-C저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)