JAVA/Coding Test

[JAVA] 백준 1004 어린 왕자_기하1

오늘도개발 2023. 3. 8. 10:40

https://www.acmicpc.net/problem/1004

 

1004번: 어린 왕자

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 첫째 줄에 출발점 (x1, y1)과 도착점 (x2, y2)이 주어진다. 두 번째 줄에는 행성계의 개수 n이 주

www.acmicpc.net

 

 접근 :

 

 - 테스트 케이스 갯수 T를 받는다. (코드에서는 n으로 구현)

 

 - 출발점과 도착점을 받는다.

 

 - 행성수 n을 입력 받는다. (코드에서는 planet_num 으로 구현)

 

 - 출발점과 도착점의 좌표가 행성의 원의 방정식에 포함 여부를 확인하여 진입/이탈 횟수를 계산한다.

 

 

 - 발생할 수 있는 경우의 수는 다음과 같다. 

 

 

 

 

 코드 구현 : 

 

import java.io.*;

public class Main {

	//행성 객체
	static class Planet {
		private int x;
		private int y;
		private int r;

		public Planet(int x, int y, int r) {
			this.x = x;
			this.y = y;
			this.r = r;
		}

		// 중간에 걸쳐진 경우는 존재하지 않음
		boolean checkInside(int x, int y) {
			return Math.pow((x - this.x), 2) + Math.pow((y - this.y), 2) < Math.pow(this.r, 2);
		}

	    // 행성을 지나는 횟수 카운트
		public int CountContactPoint(int start_x, int start_y, int finish_x, int finish_y) {
			int result = 1;
			if (checkInside(start_x, start_y) && checkInside(finish_x, finish_y)) {
				result = 0;
			} else if (!checkInside(start_x, start_y) && !checkInside(finish_x, finish_y)) {
				result = 0;
			}
			return result;
		}
	}

	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuffer sb = new StringBuffer();
		int n = Integer.parseInt(br.readLine());
		int planet_num = 0;

		String[] inputs;
		int start_x, start_y = 0;
		int finish_x, finish_y = 0;
		Planet[] planet_array;
		int result = 0;

		// 각각의 변 길이 입력, 가장 큰 사각형의 x, y값 저장
		for (int i = 0; i < n; i++) {

			// 출발, 도착 지점의 좌표
			inputs = br.readLine().split(" ");
			result = 0;
			start_x = Integer.parseInt(inputs[0]);
			start_y = Integer.parseInt(inputs[1]);
			finish_x = Integer.parseInt(inputs[2]);
			finish_y = Integer.parseInt(inputs[3]);
			planet_num = Integer.parseInt(br.readLine());
			planet_array = new Planet[planet_num];

			for (int j = 0; j < planet_num; j++) {
				inputs = br.readLine().split(" ");

				planet_array[j] = new Planet(Integer.parseInt(inputs[0]), Integer.parseInt(inputs[1]),
						Integer.parseInt(inputs[2]));

				result += planet_array[j].CountContactPoint(start_x, start_y, finish_x, finish_y);
			}
			sb.append(result).append("\n");
		}

		System.out.println(sb);
		br.close();
	}
}