백준 1002번

신형석·2022년 2월 17일
0

알고리즘 풀이

목록 보기
1/41

백준 1002번은 중학교? 고등학교? 때 배운 두 원의 위치 관계에 대한 문제이다. 두 원의 중심과 반지름이 주어지고, 이 원들의 위치 관계를 묻는다.

두 원의 반지름 길이는 각각 r1, r2라고 하고, 두 원의 중심의 거리는 d라고 칭하겠다.

  1. 두 원이 만나지 않을 때 :

두 가지 경우가 있다.

1) 원이 서로 밖에서 만나지 않을 때 : r1 + r2 < d

2) 원이 서로 안에서 만나지 않을 때 : |r1 - r2| > d

  1. 두 원이 한 점에서 만날 때 :

이것 또한 두 가지 경우가 있다.

1) 원이 서로 외접할 때 : r1 + r2 = d

2) 원이 서로 내접할 때 : |r1 - r2| = d

  1. 두 원이 서로 같을 때 :

우리는 이러한 경우는

1) 원의 중심이 같다

2) 반지름의 길이 또한 같다

라고 할 때, 두 원이 같다고 말할 수 있겠다.

그 이외의 경우엔 모두 두 점에서 만나므로, 코드는 이렇게 나오게 된다:

#include <stdio.h>

#include <stdlib.h>

#include <math.h>


int main(void) {

	int num;

	scanf("%d", &num);

	int x1; int y1; int r1;

	int x2; int y2; int r2;

	int *result = (int*)malloc(sizeof(int) * num); //동적배열 할당

	for (int i = 0; i < num; i++) {

		scanf("%d %d %d %d %d %d", &x1, &y1, &r1, &x2, &y2, &r2);

		double distance = sqrt((x1 - x2) * (x1 - x2) + ((y1 - y2) * (y1 - y2)));

		if (distance > r1 + r2) { //원이 서로 밖에서 만나지 않을 때

			result[i] = 0;

		}

		else if (distance < abs(r1 - r2)) { //원이 서로 안에서 만나지 않을 때

			result[i] = 0;

		}

		else if (distance == 0 && r1 == r2) { //원의 중심이 같고, 반지름의 길이가 같다 = 원이 서로 같다 = 무한대

			result[i] = -1;

		}

		else if (distance == r1 + r2) { //원이 서로 외접할 때

			result[i] = 1;

		}

		else if(distance == abs(r1 - r2)) { //원이 서로 내접할 때

			result[i] = 1;

		}

		else { //그 외의 경우는 모두 2점에서 만난다

			result[i] = 2;

		}

	}

	for (int i = 0; i < num; i++) {

		printf("%d\n", result[i]);

	}

	free(result);

	return 0;

}

0개의 댓글