자바 백준 1004번
실버 3
https://www.acmicpc.net/problem/1004
1004번: 어린 왕자
입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 첫째 줄에 출발점 (x1, y1)과 도착점 (x2, y2)이 주어진다. 두 번째 줄에는 행성계의 개수 n이 주
www.acmicpc.net
문제 보기

분류: 수학, 기하학
문제 풀기
문제에서 요구하는 횟수를 구하기 위해서 출발점 또는 도착점이 주어지는 원들의 안에 위치하는지 판단한다. 점이 원안에 있어야 경계면을 지나기 때문이다. 이때, 출발점과 도착점이 동시에 원안에 위치할 때에는 이 판단이 성립하지 않으므로 이는 제외한다.
한 점과 원의 정보가 주어졌을때 점이 안에 있는지 판단하기 위해서는 점과 원의 중심사이의 거리를 계산하여 이 거리가 원의 반지름보다 작아야함을 이용한다.
// 점이 원 안에 있는지 확인하는 메서드 boolean containsPoint(Point p) { double distance = Math.sqrt(Math.pow(p.x - center.x, 2) + Math.pow(p.y - center.y, 2)); return distance <= radius; }
출발점과 도착점이 주어진 원안에 있는지 판단한 후, 둘 중 하나의 점만 원 안에 있을때 카운트한다.
// 하나의 점만 원안에 존재할 때 카운트 if (p1Inside && !p2Inside) { count++; } else if (!p1Inside && p2Inside) { count++; }
코드 보기
import java.util.Scanner; class Point { int x; int y; Point(int x, int y) { this.x = x; this.y = y; } } class Circle { Point center; int radius; Circle(int cx, int cy, int r) { this.center = new Point(cx, cy); this.radius = r; } // 점이 원 안에 있는지 확인하는 메서드 boolean containsPoint(Point p) { double distance = Math.sqrt(Math.pow(p.x - center.x, 2) + Math.pow(p.y - center.y, 2)); return distance <= radius; } } public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // 테스트 케이스의 개수 int T = sc.nextInt(); for (int t = 0; t < T; t++) { // 점 좌표 입력 받기 int x1 = sc.nextInt(); int y1 = sc.nextInt(); int x2 = sc.nextInt(); int y2 = sc.nextInt(); // 원의 개수 입력 받기 int n = sc.nextInt(); // 원 정보를 저장하는 배열 Circle[] circles = new Circle[n]; for (int i = 0; i < n; i++) { // 원의 중점과 반지름 입력 받기 int cx = sc.nextInt(); int cy = sc.nextInt(); int r = sc.nextInt(); circles[i] = new Circle(cx, cy, r); } // 원안에 출발점 또는 도착첨이 있는지 판별하여 카운트하는 메서드 int result = countPointsInCircles(new Point(x1, y1), new Point(x2, y2), circles); System.out.println(result); } } // 원 안에 점이 위치하는 개수 계산 메서드 private static int countPointsInCircles(Point p1, Point p2, Circle[] circles) { int count = 0; for (Circle circle : circles) { // 출발점 또는 도착점이 주어진 원안에 있는지 판단 boolean p1Inside = circle.containsPoint(p1); boolean p2Inside = circle.containsPoint(p2); // 하나의 점만 원안에 존재할 때 카운트 if (p1Inside && !p2Inside) { count++; } else if (!p1Inside && p2Inside) { count++; } } return count; } }
'공부하기 > 백준' 카테고리의 다른 글
[Java] 백준 풀기 2166 - 다각형의 면적 (0) | 2023.07.30 |
---|---|
[Java] 백준 풀기 6502 - 동혁 피자 (0) | 2023.07.29 |
[Java] 백준 풀기 16479 - 컵라면 측정하기 (0) | 2023.07.27 |
[Java] 백준 풀기 2003 - 수들의 합 2 (0) | 2023.07.26 |
[Java] 백준 풀기 1676 - 팩토리얼 0의 개수 (0) | 2023.07.25 |