본문 바로가기
Algorithm

[백준] 1002번: 터렛

by jewook3617 2021. 2. 11.

문제는 다음과 같습니다.

www.acmicpc.net/problem/1002

 

1002번: 터렛

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

www.acmicpc.net

간단히 정리하면 두 원의 중심 (x1, y1), (x2, y2) 와 두 원의 반지름 r1, r2가 주어졌을 때 원의 접점의 개수를 출력하는 문제입니다.

접점의 개수가 무한대일 경우 -1을 출력합니다.

접점의 개수를 구하기 위해서는 세 가지 변수가 필요합니다.

  • distance : 두 원의 중심 사이의 거리

  • rsum : 두 원의 반지름의 합

  • rsub : 두 원의 반지름의 차의 절대값

이제 경우의 수를 살펴보겠습니다.

우선 두 원의 중심과 반지름이 모두 같은 경우에는 접점의 개수가 무한대입니다. 

두 원의 접점의 개수가 무한대인 경우

위 경우를 코드로 나타내면 distance == 0 && rsub == 0 입니다.

 

다음은 접점의 개수가 0개인 경우입니다.

출처 : https://blog.naver.com/donglove05/222021939359
출처 : https://blog.naver.com/donglove05/222021939359

위 경우를 코드로 나타내면 distance > rsum || distance < rsub 입니다.

 

다음은 접점의 개수가 1개인 경우입니다.

출처 : https://blog.naver.com/donglove05/222021939359
출처 : https://blog.naver.com/donglove05/222021939359

위 경우를 코드로 나타내면 distance == rsum || distance == rsub 입니다.

 

마지막으로 접점의 개수가 2개인 경우입니다.

위 경우를 코드로 나타내면 distance < rsum && distance > rsub 입니다.

 

위 내용들을 정리하면 다음과 같습니다.

  • distance == 0 && rsub == 0                 ->  -1

  • distance > rsum || distance < rsub       ->  0

  • distance == rsum || distance == rsub   ->  1

  • distance < rsum && distance > rsub    ->  2

 

다음은 코드입니다.

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

public class BOJ1002 {
  public static double getDistance(int x1, int y1, int x2, int y2) {
    return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
  }

  public static int getContactCount(double distance, int rsum, int rsub) {
    if (distance == 0 && rsub == 0)
      return -1;
    if (distance > rsum || distance < rsub)
      return 0;
    if (distance == rsum || distance == rsub)
      return 1;
    return 2;
  }

  public static void main(String args[]) throws Exception {

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    int num = Integer.parseInt(br.readLine());

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

      double distance = getDistance(x1, y1, x2, y2);
      int rsum = r1 + r2;
      int rsub = Math.abs(r1 - r2);

      System.out.println(getContactCount(distance, rsum, rsub));
    }
  }
}