[백준-Java] 기본수학 2 (11번)

RedPanda·2021년 10월 12일
0

[알고리즘] Java

목록 보기
7/16

오늘은 한 문제만 포스팅해야겠다.

1002번) 터렛

이 문제는 각각 x,y 좌표를 가진 두 원의 접점을 찾는 문제이다.

문제를 풀기 위해 조건을 생각해 보자.

1) 같은 좌표, 같은 거리일때

x, y좌표가 같고 r값 모두 같다면 같은 원이다.
이 경우에 접점은 무한이므로 -1이다.

2) 두 원이 접하지 않을 때

두 원이 접하지 않는 경우는 두가지이다.

  • 두 점 사이의 거리가 반지름의 합보다 클 때(외부)
    : 두 터렛이 측정한 r을 더한 값이 두 좌표 사이의 거리보다 작을 때이다.
  • 두 점 사이의 거리가 반지름의 차보다 작을 때(내부)
    : 원이 다른 원의 내부에 있을 때이다.
    이 경우에 큰 반지름에서 작은 반지름을 빼면 점과 점사이의 거리와 작은 원과 큰 원 사이의 간격이 남기 때문에
    두 점 사이의 거리가 반지름의 차보다 작을 때 이다.

이 경우에 접점은 0개이다.

3) 두 원이 한 점에서 접할 때

두 원이 한 점에서 접하는 경우는 두가지이다.

  • 바깥에서 접할때(외접)
    : 외접하는 경우는 두 점사이의 거리가 두 반지름을 더한 값과 같을 때이다.

  • 내부에서 접할때(내접)
    : 내접하는 경우는 두 점사이의 거리가 두 반지름의 차와 같을 때이다.

두 경우 모두 한 점에서 접하기 때문에 1이다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        for(int i = 0; i < T; i++){
            String loc = br.readLine();
            String[] data = loc.split(" ");
            int x1 = Integer.parseInt(data[0]);
            int y1 = Integer.parseInt(data[1]);
            int r1 = Integer.parseInt(data[2]);
            int x2 = Integer.parseInt(data[3]);
            int y2 = Integer.parseInt(data[4]);
            int r2 = Integer.parseInt(data[5]);

            int r = (int)(Math.pow((x1-x2),2) + Math.pow((y1-y2),2));

            if(x1==x2&& y1==y2 && r1==r2) System.out.println(-1);
            else if(r > Math.pow(r1+r2, 2))System.out.println(0);
            else if(r < Math.pow(r1-r2,2)) System.out.println(0);
            else if(r == Math.pow(r1-r2, 2)) System.out.println(1);
            else if(r == Math.pow(r1+r2, 2)) System.out.println(1);
            else System.out.println(2);
        }
    }
}

여담

이외에 주의할 점은 두 점사이의 거리를 구할 때이다.

Math.sqrt()를 사용하지 않은 이유는 Java에서 부동소수점 계산을 근사치로 처리하는 경우가 있기 때문이다.

정확한 계산을 위해 계산시에 피연산자에 제곱을 했다.

사실 문제를 해석하는 것까지는 얼마 걸리지 않았다.
경우의 수를 너무 많이 두는 바람에 오히려 생각이 꼬여버렸다.

꼬이면 처음부터 다시 생각해보는 용기가 필요하다는 것을 느끼는 문제였다.

profile
끄적끄적 코딩일기

0개의 댓글