알고리즘/코테 문제풀이

[백준] 01002. 터렛

최새벽 2024. 6. 15. 18:51

사용언어: Java



1002. 터렛 

 

https://www.acmicpc.net/problem/1002

 

 

 

solved ac에서 기하학 파트 문제를 푼적이 없길래 도전

생각

원의 접점 개수를 구하는 문제인 건 금방 파악했으나, 해당 조건이 기억 안나서 하나하나 시도해보느라 조금 오래 걸렸다. 

 

원 중심이 겹치는 경우

  ① 반지름 길이가 같은 경우: (겹치는 지점이 무수히 많음)  -1

  ② 원 중심이 겹치나 반지름 길이가 다른 경우 : 0

원 중심이 겹치지 않는 경우

    원 안에 원이 있는 경우

      ③ 두 중심 사이 거리가 각 원의 반지름 길이 차보다 작은 경우 : 0

      ④ 두 중심 사이 거리가 각 원의 반지름 길이 차와 같을 경우 : 1

    원 밖에 원이 있는 경우 

      ⑤ 두 중심 사이 거리가 각 원의 반지름 길이 합보다 클 경우 : 0

      ⑥ 두 중심 사이 거리가 각 원의 반지름 길이 합과 같을 경우 : 1

⑦ 그 외 : 2

 

풀이 코드

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

public class C01002 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        for (int i = 0; i < n; i++) {
            String[] tempArr = br.readLine().split(" ");
            int x1 = Integer.parseInt(tempArr[0]);
            int y1 = Integer.parseInt(tempArr[1]);
            int r1 = Integer.parseInt(tempArr[2]);
            int x2 = Integer.parseInt(tempArr[3]);
            int y2 = Integer.parseInt(tempArr[4]);
            int r2 = Integer.parseInt(tempArr[5]);

            // 거리 구할 때 원래 제곱근 해줘야 하지만 그냥 다른 비교 숫자를 제곱 해줌
            double distSquared = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
            double rSumSquared = (r1 + r2) * (r1 + r2);
            double rDiffSquared = (r1 - r2) * (r1 - r2);

            if (x1 == x2 && y1 == y2) {
                if (r1 == r2) {
                    System.out.println(-1); // 두 원이 겹치는 경우 -> 접점 무한대
                } else {
                    System.out.println(0); // 두 원의 중심이 같으나 반지름 길이가 다른 경우 -> 접점 x
                }
            } else {
                if (distSquared > rSumSquared || distSquared < rDiffSquared) {
                    System.out.println(0); // 두 원 중심 사이의 거리가 반지름의 길이 합보다 크거나(원안에 원x),
                    // 두 원 중심 사이 거리가 반지름 길이 차보다 작을 경우(원 안에 원이 있음)
                } else if (distSquared == rSumSquared || distSquared == rDiffSquared) {
                    System.out.println(1); // (원 안에 원x) 중심 거리와 반지름 합이 같음, (원 안의 원) 중심 거리와 반지름 차가 같음
                } else {
                    System.out.println(2);
                }
            }
        }
    }
}