끄적끄적 코딩
article thumbnail
Published 2019. 8. 31. 17:21
[C++] 백준 1002번 터렛 알고리즘

(x1, y1)좌표와, (x2, y2)좌표에서 반지름이 각각 r1, r2인 원을 그릴 때
접하는 부분이 몇개인지 구하는 문제입니다.

1. 두개의 좌표가 접할 경우 ( x1 == x2 && y1 == y2 )
  1) 반지름이 동일하면 똑같은 위치에서 같은 크기의 원을 그리므로 무수한 부분을 접함 ( - 1)
       r1 == r2

  2) 반지름이 같지 않으면 원안에 원이 있는 모양으로 접하는 부분이 없음 ( 0 )
       r1 != r2

2. 두개의 좌표가 다를 경우 x1 != x2 || y1 != y2 )
  1) 두개의 반지름의 길이의 합보다 둘 사이의 거리가 작고,
     두개의 반지름의 차보다 둘 사이의 거리보다 크면 두개의 점을 가짐 (2)
        r1 + r2 > d && abs(r1 - r2) < d

  2) 두개의 반지름의 합과 거리가 같거나, 두개의 반지름의 차와 거리가 같으면 한개의 점을 가짐 ( 1 )
        r1 + r2 == i || abs(r1 - r2) == i

  3) 이 외의 부분에서는 접하는 부분이 없음 ( 0 )


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

int main(int argc, char *argv[])
{
	double d;
	int ts;
	int x1, x2, y1, y2, r1, r2;

	cin >> ts;

	while (ts--) {
		cin >> x1;
		cin >> y1;
		cin >> r1;
		cin >> x2;
		cin >> y2;
		cin >> r2;

		d = sqrt(pow(x1 - x2, 2.0) + pow(y1 - y2, 2.0));

		if (x1 == x2 && y1 == y2) {
			if (r1 == r2) {
				cout << "-1";
			}
			else {
				cout << "0";
			}
		}
		else {
			if ((r1 + r2) > d && abs(r1 - r2) < d) {
				cout << "2";
			}
			else if ((r1 + r2) == d || abs(r1 - r2) == d) {
				cout << "1";
			}
			else{
				cout << "0";
			}
		}
		cout << "\n";
	}

	return 0;
}

'알고리즘' 카테고리의 다른 글

[C++] 백준 2231번 분해합  (0) 2019.09.01
[C++] 백준 2798번 블랙잭  (0) 2019.09.01
[C++] 백준 3053번 택시 기하학  (0) 2019.08.31
[C++] 백준 4153번 직각삼각형  (0) 2019.08.31
[C++] 백준 3009번 네 번째 점  (0) 2019.08.31

검색 태그