본문 바로가기

백준

[백준] 터렛 (1002번)

728x90

코드 힌트

  1. 두 원의 중심이 같을 때:
    • 반지름이 같을 경우: 두 원이 완전히 겹치며, 무한히 많은 교점이 존재할 수 있습니다. 이 경우 교점의 개수를 -1로 출력합니다.
    • 반지름이 다를 경우: 두 원은 동심원이지만 겹치지 않으므로 교점이 없습니다. 이 경우 0을 출력합니다.
  2. 두 원의 중심이 다를 때:
    • 원들이 서로 겹치지 않는 경우:
      • 서로 떨어져 있는 경우: 두 원의 중심 사이의 거리 d가 두 원의 반지름 합 r1 + r2보다 크면, 원들은 겹치지 않으므로 교점이 없습니다.
      • 한 원이 다른 원의 내부에 있지만 접하지 않는 경우: 두 원의 중심 사이의 거리 d가 큰 원의 반지름에서 작은 원의 반지름을 뺀 값보다 작으면, 교점이 없습니다.
    • 원들이 한 점에서 접하는 경우:
      • 외접: 두 원의 중심 사이의 거리 d가 두 반지름의 합과 같을 때 원들은 외접합니다. 이 경우 교점이 하나 있습니다.
      • 내접: 두 원의 중심 사이의 거리 d가 큰 반지름에서 작은 반지름을 뺀 값과 같을 때 원들은 내접합니다. 이 경우도 교점이 하나 있습니다.
    • 원들이 두 점에서 교차하는 경우: 중심 사이의 거리 d가 반지름 합보다 작고, 반지름 차이보다 클 때 두 원은 두 점에서 교차합니다. 이 경우 교점이 두 개 존재합니다.

문제 풀 때 도움이 된 사이트 : https://houseofj.tistory.com/167

 

두 원의 중심거리에 따른 두 원의 위치 관계

두 원의 위치 관계의 종류 평면 위에 두 개의 원을 그리면 어떻게 그러던 두 원의 위치 관계는 6가지 중 하나에 해당된다. 그 6가지를 그림을 통하여 하나하나 살펴보자. 위와 같이 원이 2개가 있

houseofj.tistory.com

 


정답은 더보기 클릭

더보기
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        // BufferedReader와 BufferedWriter를 사용해 입출력 처리
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        // 테스트 케이스의 수를 입력 받음
        int n = Integer.parseInt(br.readLine());

        for (int i = 0; i < n; i++) {
            // 각 테스트 케이스에서 두 원의 정보를 입력 받음
            String[] arr = br.readLine().split(" ");
            
            int x1 = Integer.parseInt(arr[0]); // 첫 번째 원의 중심 x좌표
            int y1 = Integer.parseInt(arr[1]); // 첫 번째 원의 중심 y좌표
            int r1 = Integer.parseInt(arr[2]); // 첫 번째 원의 반지름
            
            int x2 = Integer.parseInt(arr[3]); // 두 번째 원의 중심 x좌표
            int y2 = Integer.parseInt(arr[4]); // 두 번째 원의 중심 y좌표
            int r2 = Integer.parseInt(arr[5]); // 두 번째 원의 반지름
            
            // 두 원의 중심점 거리 distance
            double d = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));

            // 두 원의 중심이 같은 경우
            if (x1 == x2 && y1 == y2) {
                // 두 원의 반지름이 같을 때: 무한히 많은 교점이 존재함
                if (r1 == r2) {
                    bw.write("-1\n");
                } 
                // 동심원이지만 반지름이 다를 때: 교점이 없음
                else {
                    bw.write("0\n");
                }
            }
            // 두 원의 중심이 다른 경우
            else {
                // 두 원이 서로 겹치지 않는 경우: 교점이 없음
                if (r1 + r2 < d || Math.abs(r1 - r2) > d) {
                    bw.write("0\n");
                }
                // 두 원이 한 점에서 접하는 경우: 교점이 한 개
                else if (r1 + r2 == d || Math.abs(r1 - r2) == d) {
                    bw.write("1\n");
                }
                // 두 원이 두 점에서 교차하는 경우: 교점이 두 개
                else {
                    bw.write("2\n");
                }
            }
        }
        
        // BufferedWriter의 남은 데이터를 출력
        bw.flush();
        bw.close();
    }
}
728x90

'백준' 카테고리의 다른 글

[백준] 단어 정렬 (1181번)  (0) 2024.08.17
[백준] 나이순 정렬 (10814번)  (0) 2024.08.17
[백준] 스택 10828번  (0) 2024.08.15
[백준] 별 찍기 - 3 (2440번)  (0) 2024.08.15
[백준] 피보나치 수 5 (10870번)  (0) 2024.08.15