문제풀이

[JAVA] 백준 1002번 터렛 : 두 원의 교차점

IT록흐 2021. 7. 24. 09:09
반응형
 

1002번: 터렛

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

www.acmicpc.net

 

1. 문제 추상화

 

임의의 Z 지점이 있다. A점과 Z점 사이의 거리가 r1, B점과 Z점 사이의 거리가 r2를 만족할 때, Z 지점의 경우의 수를 구하라.

 

2. 알고리즘

 

Z점과 A점의 거리가 r1이 되는 경우의 수는 무한이다. 원이기 때문이다.

Z점과 B점의 거리가 r2가 되는 경우의 수도 무한이다. 원이기 때문이다.

 

그러므로 r1과 r2를 동시에 만족하는 Z지점의 개수는 두 원의 교차점의 개수와 같다.

 

 

두 원의 위치관계, 내접, 외접

위치관계 또 나오네요. 이번에는 두 원의 위치관계에요. 위치관계 마지막이니까 정신 바짝 차리고 따라오세요. 원과 직선의 위치관계, 원의 할선과 접선, 접점에서 했던 것처럼 두 원이 어떤 관

mathbang.net

교차점의 개수 구하는 알고리즘은 위 사이트에 자세히 설명되어 있으니 참고바란다. ( 중학 수학 내용이다. )

 

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;
			}	
		}
	}
	
}
반응형