https://www.acmicpc.net/problem/1002
문제
> 조규현과 백승환은 터렛에 근무하는 직원이다.
> 하지만 워낙 존재감이 없어서 인구수는 차지하지 않는다.
> 다음은 조규현과 백승환의 사진이다.
> 이석원은 조규현과 백승환에게 상대편 마린(류재명)의 위치를 계산하라는 명령을 내렸다.
> 조규현과 백승환은 각각 자신의 터렛 위치에서 현재 적까지의 거리를 계산했다.
> 조규현의 좌표 (x1, y1)와 백승환의 좌표 (x2, y2)가 주어지고,
조규현이 계산한 류재명과의 거리 r1과 백승환이 계산한 류재명과의 거리 r2가 주어졌을 때,
류재명이 있을 수 있는 좌표의 수를 출력하는 프로그램을 작성하시오.

접근
재명이가 가능한 위치는 좌표상에 찍어보면 규현,승환의 좌표기준 각각의 r1, r2거리에 있는 점이다. 이는 다시말해
규현,승환의 좌표를 중점으로 가지며 r1과 r2를 반지름으로 가지는 두 원의 관계가 된다.
재명의 좌표가 무한대려면 두 원이 동심원 일 때 가능하다.
즉, 두 중점 사이거리가 0이며 r1,r2가 같을 때 이다.
재명이의 좌표가 0개 일 땐, 두 원의 접점이 없을 때이다.
한 원이 다른 원안에 포함되는데 반지름이 다를 때인 r1-r2 보다 두 중점사이의 거리가 작을 때와
두 원이 서로 멀리 떨어져 못만날 때인 r1+r2보다 중점 사이 거리가 더 클 때이다.
재명이의 좌표가 1개일 땐, 접점이 한개 일 때로, r1+r2가 중점 사이의 거리와 같을 때와 r1-r2가 중점사이의 거리와 같을 때(한 원이 다른원에 포함되는데 한곳이 닿아 접점이 한개일때) 이다.
재명이의 좌표가 2개일 땐, 두 원이 서로 겹쳐있을 때이다.
즉 앞서 나눠준 경우를 제외한 경우이다.
문제해결
> 테스트 케이스의 수를 입력받고 각 테스트 케이스마다 x1,y1,r1과 x2,y2,r2를 입력받는다.
> dis를 sqrt해버리면 실수가 되므로 제곱된 상태로 관계를 따진다.
> 중점사이의 거리를 제곱된 상태로 따지므로 두 반지름의 차와 합도 각각 제곱해준 상태로 비교한다.
> 두 원이 동심원일 때, 접점이 없을 때, 한 점에서 접할 때, 접점이 두개 일 때의 분기를 나눠준다.
코드
import java.io.*;
import java.util.*;
import java.lang.*;
public class Main {
//1002 터렛
public static void main(String[] args) throws IOException {
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
while(T--> 0) {
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());
double dis = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);
int sum = (r1 + r2) * (r1 + r2);
int diff = (r1 - r2) * (r1 - r2);
if(dis == 0 && r1 == r2) sb.append(-1).append('\n');
else if(dis > sum || dis < diff) sb.append(0).append('\n');
else if(dis == sum || dis == diff) sb.append(1).append('\n');
else sb.append(2).append('\n');
}
System.out.print(sb);
}
}

후기
왜 재명이의 좌표가 여러개일까? 에서 생각해보다 규현,승환의 좌표가 원의 중심이고 r1,r2가 반지름이라는걸 알았다. 그리고 원의 접점관계를 그려보며 각각 어떨 때 몇개가 나오는지 나눴다.