알고리즘공부(Algorithm Study)/문제풀이(ProblemSolving)

백준 1004 java - 어린왕자(기하)

Chaany 2022. 5. 18.
728x90

문제, 입출력, 테스트케이스

해당 문제는 이게 되나? 라고 했다가 테케 1번 맞추고 바로 제출하니 패스된 문제이다. 논리상 이거 밖에 없다!라고 해서 냈더니 너무 순순히 성공이 뜬... 신기하다.

 

 

<문제 풀이/접근과정>
1. 그림을 살펴보니 출발점을 포함한 행성계(원)의 개수 + 도착점 포함한 행성계(원)의 개수이다.
2. 더 잘 살펴보니 같은 행성계에 있을 땐 개수에 포함 안되고 다른 행성계에 있을 때 세면 된다.
3. 원 내부에 있는지 확인하는 식은 원의 방정식 x^2 + y^2 = r^2을 변형해서 (x - x1)^2 + (y - y1)^2 < r^2로 구하면 된다. => 이게 가능한 이유는 문제의 전제조건 중에 원이 교차하지 않고 경계 위에 출발, 도착점이 없다고 정의했기 때문이다.

<소스코드>

package boj;

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

public class Boj_1004 {
	public static void main(String[] args) throws NumberFormatException, IOException {
		// x1, y1 -> 출발점 / x2, y2 -> 도착점
		
		// 각 원의 내부에 점들이 위치해 있는 지 파악하면 끝
		// (x - x1)^2 + (y - y1)^2 < r^2
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int T = Integer.parseInt(br.readLine());
		StringTokenizer stz;
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < T; i++) {
			stz = new StringTokenizer(br.readLine());
			int x1 = Integer.parseInt(stz.nextToken());
			int y1 = Integer.parseInt(stz.nextToken());
			int x2 = Integer.parseInt(stz.nextToken());
			int y2 = Integer.parseInt(stz.nextToken());
			
			int n = Integer.parseInt(br.readLine());
			int answer = 0;
			
			for (int j = 0; j < n; j++) {
				stz = new StringTokenizer(br.readLine());
				int x = Integer.parseInt(stz.nextToken());
				int y = Integer.parseInt(stz.nextToken());
				int r = Integer.parseInt(stz.nextToken());
				
				if(Math.pow((x-x1), 2) + Math.pow((y-y1), 2) < Math.pow(r, 2)&& Math.pow((x-x2), 2) + Math.pow((y-y2), 2) > Math.pow(r, 2)) {
					answer++;
				}
				if(Math.pow((x-x1), 2) + Math.pow((y-y1), 2) > Math.pow(r, 2)&& Math.pow((x-x2), 2) + Math.pow((y-y2), 2) < Math.pow(r, 2)) {
					answer++;
				}
			}
			
			sb.append(answer).append("\n");
			
		}
		sb.setLength(sb.length()-1);
		System.out.println(sb.toString());
		
	}
}

 

 

 

728x90

댓글