백준 - 터렛[java]

스브코·2021년 12월 18일
0

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


문제 설명

x1, y1, r1, x2, y2, r2 라는 좌표가 주어지는데

r1, r2 는 거리를 나타낸다

(x1,y1)에서 r1의 거리와 (x2, y2)에서 r2의 거리 안에 서로 겹쳐지는 좌표가 몇개 있는지 구하는 문제이다


문제 예시

URI예제입력예제 출력
test case 13
0 0 13 40 0 37
0 0 3 0 7 4
1 1 1 1 1 5
2
1
0

문제 풀이

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int total = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < total; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int x1 = Integer.parseInt(st.nextToken());
            int y1 = Integer.parseInt(st.nextToken());
            int r1 = Integer.parseInt(st.nextToken());
            int x2 = Integer.parseInt(st.nextToken());
            int y2 = Integer.parseInt(st.nextToken());
            int r2 = Integer.parseInt(st.nextToken());
            if (x1 == x2 && y1 == y2 && r1 == r2)
                sb.append(-1).append("\n");
            else if (x1 == x2 && y1 == y2 && r1 != r2)
                sb.append(0).append("\n");
            else {
                double abs = Math.sqrt(Math.pow(Math.abs(x1 - x2), 2) + Math.pow(Math.abs(y1 - y2), 2));
                if (abs < (double) (r1 + r2)) {
                    if (Math.abs(r1 - r2) == abs)
                        sb.append(1).append("\n");
                    else if (Math.abs(r1 - r2) > abs)
                        sb.append(0).append("\n");
                    else
                        sb.append(2).append("\n");
                } else if (abs == (double) (r1 + r2))
                    sb.append(1).append("\n");
                else
                    sb.append(0).append("\n");
            }
        }
        System.out.println(sb);
        br.close();
    }
}

문제를 처음에 잘못 접근했었어서 시간이 다소 오래걸렸지만,

피타고라스의 정리를 이용하면 된다는걸 알면 생각보다 간단한 문제이다.

(x1, y1) 과 (x2, y2)의 거리를 √(a^2 + b^2)를 이용해서 더한후 주어진 거리인 r1, r2의 거리를 더한후 두 길이를 비교하여 리턴할 값을 구하면 된다. 가능한 결과 값은 2, 1, 0, ∞ 이다. 무한대의 경우 -1을 리턴하라고 나와 있기 때문에 2, 1, 0, -1의 경우의 수를 이제 if문으로 처리 해주어야 하는데,

∞의 경우

x, y 좌표가 서로 같고 거리도 같을때

1의 경우

서로 1개의 접점을 가질때 인데 두가지 경우가 있다.

  • (x1, y1)과 (x2, y2)의 거리와 주어진 두 거리(r1, r2)의 합이 같을때
  • (x1, y1)의 범위 안에 (x2, y2)가 위치해 있고 (x1, y1)과 (x2, y2)의 거리와 r2의 합이 r1의 합이 같을때,
    즉 두 거리(r1, r2)의 차이와 (x1, y1)과 (x2, y2)의 거리가 같을때

2의 경우

(x1, y1)과 (x2, y2)의 거리보다 주어진 두 거리(r1, r2)의 합이 클때

0의 경우

  • (x1, y1)과 (x2, y2)의 거리보다 주어진 두 거리(r1, r2)의 합이 작을때
  • x, y 좌표가 서로 같은데 거리는 다를때

나는 이정도 나누어 풀었다. 생각보다 if문 처리가 시간이 오래 걸렸는데, 쉬운것 같으면서도 은근히 신경써야될게 많은 문제였다.

profile
익히는 속도가 까먹는 속도를 추월하는 그날까지...

0개의 댓글