반응형
1. 문제 추상화
임의의 Z 지점이 있다. A점과 Z점 사이의 거리가 r1, B점과 Z점 사이의 거리가 r2를 만족할 때, Z 지점의 경우의 수를 구하라.
2. 알고리즘
Z점과 A점의 거리가 r1이 되는 경우의 수는 무한이다. 원이기 때문이다.
Z점과 B점의 거리가 r2가 되는 경우의 수도 무한이다. 원이기 때문이다.
그러므로 r1과 r2를 동시에 만족하는 Z지점의 개수는 두 원의 교차점의 개수와 같다.
교차점의 개수 구하는 알고리즘은 위 사이트에 자세히 설명되어 있으니 참고바란다. ( 중학 수학 내용이다. )
3. 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer stz;
int testcase = Integer.parseInt(br.readLine());
for(int i =0 ; i< testcase;i++) {
stz = new StringTokenizer(br.readLine());
int x1 = Integer.parseInt(stz.nextToken());
int y1 = Integer.parseInt(stz.nextToken());
int r1 = Integer.parseInt(stz.nextToken());
int x2 = Integer.parseInt(stz.nextToken());
int y2 = Integer.parseInt(stz.nextToken());
int r2 = Integer.parseInt(stz.nextToken());
bw.write(countMeanNumber(x1,y1,r1,x2,y2,r2)+"\n");
}
bw.flush();
bw.close();
br.close();
}
public static int countMeanNumber(int x1, int y1, int r1, int x2, int y2, int r2) {
double distance = Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
if(distance != 0) { // 두 점이 일치하지 않은 경우
// 위치의 개수 : 2
if ((r1+r2) > distance && Math.abs(r1-r2) < distance ) {
return 2;
}
// 위치의 개수 : 0
else if ((r1+r2) < distance || Math.abs(r1-r2) > distance) {
return 0;
}
// 위치의 개수 : 1
else {
return 1;
}
}else { // 두 점이 일치하는 경우
if(r1 != r2 ) {
return 0;
}else {
return -1;
}
}
}
}
반응형
'문제풀이' 카테고리의 다른 글
[JAVA] 백준 11729번 하노이 탑 이동 순서 : 재귀함수 (0) | 2021.07.26 |
---|---|
[JAVA] 백준 3053번 택시 기하학 : 유추 (0) | 2021.07.24 |
[JAVA] 백준 3009 네 번째 점 : Simple is best (0) | 2021.07.23 |
[JAVA] 백준 1085번 직사각형에서 탈출 : 단서로 풀기 (0) | 2021.07.22 |
[JAVA] 백준 1011번 Fly me to the Alpha Centauri : 부등식과 반복문 3 (0) | 2021.07.20 |