BOJ

백준 1002번 터렛 [JAVA]

Sloth Coder 2022. 9. 10. 22:42

문제 출처: https://www.acmicpc.net/problem/1002

 

1002번: 터렛

각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.

www.acmicpc.net

 

 

Sol)

import java.io.*;
import java.util.Arrays;

public class Main {

    public static void main(String[] args) throws Exception {
        int circle1[] = new int[3]; //0번째 인덱스 = x좌표, 1번째 인덱스 = y좌표, 2번째 인덱스 = 반지름
        int circle2[] = new int[3];
        double distance, tc;
        String[] temp;

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        tc = Integer.parseInt(br.readLine());

        while(tc > 0){
            temp = br.readLine().split(" ");

            for(int i = 0; i < circle1.length; i++){
                circle1[i] = Integer.parseInt(temp[i]);
                circle2[i] = Integer.parseInt(temp[i + 3]);
            }

            distance = Math.sqrt((circle1[0] - circle2[0]) * (circle1[0] - circle2[0]) + (circle1[1] - circle2[1]) * (circle1[1] - circle2[1]));

            if(circle1[2] + circle2[2] > distance && distance > Math.abs(circle1[2] - circle2[2]))
                bw.write("2\n");
            else if(circle1[2] + circle2[2] == distance || distance == Math.abs(circle1[2] - circle2[2])) {
                if(Arrays.equals(circle1, circle2)) //두 원이 같다면 distance = 0, r1 - r2 값도 0.
                    bw.write("-1\n");
                else
                    bw.write("1\n");
            }
            else
                bw.write("0\n");

            tc--;
        }
        br.close();
        bw.close();
    }
}

 

  • 풀이 방향

두 원의 관계를 묻는 문제였다. 케이스 분류를 잘 하면 되겠다.

 

  • 풀이

두 원의 관계의 종류에는 세가지가 있다.

1. 두 점에서 만나는 경우

2. 한 점에서 만나는 경우(접하는 경우)

3. 만나지 않는 경우

 

가장 특수한 경우인 접하는 경우를 중심으로 살펴보면 다음과 같은 케이스 분류가 가능하다.

내접, 외접하면 가능한 위치는 1개, 1, 2번 케이스의 경우 2개, 3, 4번 케이스의 경우 0개, 두 원이 완전히 일치하면 무한대.

이제 위의 케이스 분류를 바탕을 if문을 써주기만 하면 끝난다. 단, 내접하는 케이스의 식, 즉 abs(r2 - r1) == d 는 두 원이 완전히 일치할 때도 만족시키므로, 추가적으로 두 원이 일치하는지 여부를 체크하는 if문을 넣어 주어야 한다.

 

  • 문제에 대한 사견

수학적 관점이 필요한 문제여서 그런지 정답률이 많이 낮았다. 개인적으로 입력값들이 정수가 아니라 소수였다면 부동소수점 저장방식때문에 발생하는 비교 오류로 인해 정답률이 더 낮아졌을 것 같다.