백준 1002 - 터렛 (C언어)

라치현·2023년 3월 1일
0

baekjoon online judge

목록 보기
1/3

백준 사이트를 처음 접하고 3번째로 푼 실버 문제이다.

문제

문제로 이동하기

해법 추론

문제를 읽어보면 두 점의 좌표와 함께 그 두 점과 류제명까지의 거리가 나와있는 것을 보고 원을 떠올릴 수 있다.

즉, 두 기준점을 원의 중심, 측정된 거리를 반지름으로 하는 원으로 그릴 수가 있다.

원을 그렸으면 문제 해결의 방향은 잡은 것이다. 류제명이 있을 수 있는 위치는 두 원의 교점이 될 것이다. 만약 두 원이 서로다른 두 점에서 만나면 위치는 2개, 한 점에서 접하면 1개, 교점이 없으면 0이다.

문제에서 그러한 점이 무한개이면 -1을 출력하라 했는데 그러한 점이 무한개라면 두 원이 동일해야만 한다.

해법

첫 번째 반지름을 r1r_1, 두 번째 반지름을 r2r_2라고 하고 두 원의 중심 사이의 거리를 lengthlength라고 하면

두 원이 두 점에서 만나기 위해서는 r1+r2>lengthr_1 + r_2 > length 이어야 하고

두 원이 한 점에서 만나기 위해서는 r1+r2=lengthr_1 + r_2 = length 이어야 하고

두 원이 만나지 않기 위해서는 r1+r2<lengthr_1 + r_2 < length 이어야 한다.

위 관계식을 갖고 코드를 짜면 코드는 다음과 같다.

코드

#include<stdio.h>

int main(void)
{
	int T, X_1, Y_1, r_1, X_2, Y_2, r_2;
	int length_2;
	int sub;
	scanf_s("%d", &T);
	while (T--)
	{
		scanf_s("%d%d%d%d%d%d", &X_1, &Y_1, &r_1, &X_2, &Y_2, &r_2);
		length_2 = (X_1 - X_2) * (X_1 - X_2) + (Y_1 - Y_2) * (Y_1 - Y_2);
		sub = r_1 > r_2 ? r_1 - r_2 : r_2 - r_1;

		if (r_1 == r_2 && length_2 == 0) { printf("-1\n"); }
		else if (length_2 > (r_1 + r_2) * (r_1 + r_2) || length_2 < sub * sub) { printf("0\n"); }
		else if (length_2 < (r_1 + r_2) * (r_1 + r_2) && length_2 > sub * sub) { printf("2\n"); }
		else if (length_2 == (r_1 + r_2) * (r_1 + r_2) || length_2 == sub * sub) { printf("1\n"); }
	}
	return 0;
}
profile
원딜학교출신

0개의 댓글