Java/백준알고리즘

[Java] 백준알고리즘 #1002 터렛

Sehyeok20 2021. 3. 11. 17:55
반응형

백준알고리즘 #1002 터렛

두개의 좌표 (x1, y1) (x2, y2) 와 이 두 좌표로부터의 거리 r1, r2가 주어질 때

임의의 점 a (a, b) 가 존재할 수 있는 좌표의 수를 출력하는 문제이다.

 

계산을 편하게 하기 위해 두 점사이의 거리를 저장해두는 변수를 만들어준다.

int dis2 = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);

제곱근을 구하려면 Math함수를 사용해야 하므로 피타고라스 공식을 이용하여 거리의 제곱을 저장해두자.

 

 

먼저 두 점과 r1, r2 가 일치할 때에는 a가 존재할 수 있는 좌표의 수는 무한대가 된다.

if (x1 == x2 && y1 == y2) {
	if (r1 == r2) {
		System.out.println(-1);
	}
}

때문에 위와 같이 이 경우의 수는 -1로 고정시켜준다.

 

 

각 좌표로부터 떨어진 거리가 주어졌기 때문에 그림으로 그려보면 쉽게 이해할 수 있다.

이 외에 나올 수 있는 경우의 수는 다음과 같다.

 

 

경우의 수

만나지 않는 경우 (좌표가 0인 경우) 는 다음과 같다.

 - 두 점이 서로 떨어져 있을 때

 - 한 점에서 그린 원이 다른 점에서 그린 원을 포함할 때

 - 두 좌표가 일치하지만 거리가 다를 때

 

만나는 경우는 다음과 같다.

 - 두 원이 외접할 때 ( 1개의 좌표 )

 - 두 원이 일부 겹칠 때 ( 2개의 좌표 )

 - 두 원이 내접할 때 ( 1개의 좌표 )

 

따라서 if문을 이용하여 각 조건을 달아주면 된다.

 

위에서 두 좌표가 일치하는 조건이 있었으므로 r1 이 r2와 다른 조건을 추가해준다.

if (x1 == x2 && y1 == y2) {
	if (r1 == r2) {
		System.out.println(-1);
	} else
		System.out.println(0);
}

 

나머지 경우의 수는 두 점 사이의 거리와 비교하면 어떤 경우인지 알 수 있으므로 앞서 구했던 dis2를 이용하여 if문을 작성해준다.

if ((r1 + r2) * (r1 + r2) < dis2) {
		System.out.println(0);
	} else if ((r1 + r2) * (r1 + r2) == dis2) {
		System.out.println(1);
	} else {
		if ((r1 - r2) * (r1 - r2) > dis2) {
			System.out.println(0);
		} else if ((r1 - r2) * (r1 - r2) == dis2) {
			System.out.println(1);
		} else
			System.out.println(2);
}

 

 

전체 코드를 보면 다음과 같다.

import java.util.Scanner;

public class Back1002 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int t = sc.nextInt();
		int x1, y1, r1, x2, y2, r2;
		for (int i = 0; i < t; i++) {
			x1 = sc.nextInt();
			y1 = sc.nextInt();
			r1 = sc.nextInt();
			x2 = sc.nextInt();
			y2 = sc.nextInt();
			r2 = sc.nextInt();
			int dis2 = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);

			if (x1 == x2 && y1 == y2) {
				if (r1 == r2) {
					System.out.println(-1);
				} else
					System.out.println(0);

			} else {
				if ((r1 + r2) * (r1 + r2) < dis2) {
					System.out.println(0);
				} else if ((r1 + r2) * (r1 + r2) == dis2) {
					System.out.println(1);
				} else {
					if ((r1 - r2) * (r1 - r2) > dis2) {
						System.out.println(0);
					} else if ((r1 - r2) * (r1 - r2) == dis2) {
						System.out.println(1);
					} else
						System.out.println(2);
				}

			}

		}

	}

}

다소 복잡한 방법으로 풀어서 코드가 길어진 감이 있다. Math.sqrt()함수를 이용하면 보다 짧고 간단하게 풀 수도 있을 듯 하다. 

반응형