[백준 1002]터렛 - JAVA 풀이
바로가기
문제
해석
- A, B의 좌표(x1, y1, x2, y2)와 각 C와의 거리(r1, r2)의 값을 준다.(x1, y1, r1, x2, y2, r2)
- 위 정보를 활용하여 C의 좌표를 특정 할 수 있는 위치가 몇 개인지 확인하면 된다.
(좌표까지는 필요 없고 위치가 몇개인지만 확인하면 된다.)
풀이
A, B을 중심으로 C의 위치는 각각 r1, r2를 반지름으로 가지는 원모양이 된다.
- 원이 겹치는 곳이 C를 특정 할 수 있는 위치가 되는데, 4가지 답이 존재한다.
- A, B의 좌표가 같고, r1 == r2 일 때, 무한대이므로 -1(x1 == x2 && y1 == y2 && r1 == r2)
- A와 B의 거리 == |r1-r2| || A와 B의 거리 == r1+r2 일 때, 1
- A와 B의 거리 < |r1-r2| && A와 B의 거리 > r1+r2일 때, 2
- 그외 값으로, 0
- A, B의 좌표가 같고, r1 == r2 일 때, 무한대이므로 -1(x1 == x2 && y1 == y2 && r1 == r2)
- A와 B의 거리는 피타고라스의 정리를 사용하여 구해준다. 제곱근(루트)는 사용하지 않았다.$(x1-x2)^2 + (y1-y2)^2$만 사용
- 제곱근을 사용하면 실수가 나옴
- 2개의 거리를 비교만 하므로 정확한 값 필요 없음
대신 r1+r2, r1-r2 값을 제곱해주어야 한다.
코드
import java.util.*;
import java.io.*;
public class Main{
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine()), answer;
for(int i = 0; i < n; 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());
int r3 = (int)Math.pow((r1+r2),2);
int r4 = r1 > r2 ? r1 - r2 : r2 - r1;
r4 *= r4;
int dis = (int)Math.pow(x1 - x2,2) + (int)Math.pow(y1 - y2,2);
if(dis == 0 && r1 == r2)
answer = -1;
else if(dis < r3 && dis> r4)
answer = 2;
else if(dis == r3 || dis == r4)
answer = 1;
else
answer = 0;
bw.write(answer + "\n");
}
bw.flush();
bw.close();
}
}