백준 문제풀이

2477. 터렛 (자바, Java)

뮤츠 2022. 10. 10. 22:42

굳이 거리 r로 주어진 것에 주목해야한다.

한 점에서 같은 거리에 있는 점들의 집합 = 원이다.

따라서 이 문제는 두 원의 중심이 주어지고, 각각의 반지름 r1, r2가 주어졌을때 교점의 수를 구하는 문제이다.

 

중간에 생각대로 풀다가 틀렸길래, 구글링으로 두 원의 교점의 갯수를 찾아 풀었다. 나는 여길 참조했다.

https://mathbang.net/101

 

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

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

mathbang.net

나는 동심원의 경우를 제대로 고려하지 않았다.

배열의 크기는 6으로 고정되있어서, 반복문은 별 제한없이 써도된다.

또, if문으로 걸러낼 때 어떤 경우의 수부터 걸러낼지 잘 생각해봐야한다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int t = Integer.parseInt(br.readLine());

		for (int i=0; i<t; 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());
			// 입력값 받기
			
			double d = Math.sqrt(Math.pow(x1-x2, 2) + Math.pow(y1-y2, 2));
			// 두 직원 사이의 거리 (=두 원의 중심 사이의 거리)
			
			int rPlus = r1+r2;
			double rMinus = Math.abs(r1-r2);
			
			if (d==0) {
				if (r1==r2) {
					System.out.println(-1);
				} else {
					System.out.println(0);
				}			
			} else {
				if (d==rPlus || d==rMinus) {
					System.out.println(1);
				} else if (d>rPlus || d<rMinus) {
					System.out.println(0);
				} else if (d>rMinus && d<rPlus) {
					System.out.println(2);
				}
			}
			
		}

	}
}