
내가 생각했을때 문제에서 원하는부분
첫 줄에 N과 M이 주어진다. (1 ≤ N, M ≤ 1000)
N개의 줄에 걸쳐 x와 y가 주어지며, 이는 Pi = (x,y)라는 뜻이다. (-10^6 ≤ x,y ≤ 10^6)
M개의 줄에 걸쳐 x와 y가 주어지며, 이는 Qi = (x,y)라는 뜻이다. (-10^6 ≤ x,y ≤ 10^6)
Q 배열 상의 한 점을 중심으로, P 배열 상 모든 점을 포함하는 최소 넓이의 원의 반지름 중 최댓값의 제곱을 출력한다.
내가 이 문제를 보고 생각해본 부분
BufferedReader와 StringTokenizer로 입력 받는다.
P, Q 각각 점의 좌표를 2차원 배열에 저장한다.
maxRadiusSquared를 long 타입으로 선언한 이유는 좌표 범위가 최대 10^6 까지이고, 거리 제곱은 약 (2×10^6)^2 = 4×10^{12} 같은 큰 값이 나올 수 있기 때문이다.
각 Q 점을 중심으로 P 점 모든 좌표와의 거리의 제곱을 구하고 가장 큰 값을 찾다.
이 최대 거리 제곱값이 Q 중 하나에서 나온 것 중에서 더 큰 값을 저장한다.
마지막으로 그 값을 출력한다.
이 방식은 단순하지만 문제에서 요구하는 모든 조건에 부합하고 효율적으로 작동한다.
코드로 구현
package baekjoon.baekjoon_34;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// 백준 17093번 문제
public class Main1372 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[][] P = new int[N][2];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
P[i][0] = Integer.parseInt(st.nextToken());
P[i][1] = Integer.parseInt(st.nextToken());
}
int[][] Q = new int[M][2];
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
Q[i][0] = Integer.parseInt(st.nextToken());
Q[i][1] = Integer.parseInt(st.nextToken());
}
long maxRadiusSquared = 0;
for (int i = 0; i < M; i++) {
long maxDistSquared = 0;
for (int j = 0; j < N; j++) {
long dx = Q[i][0] - P[j][0];
long dy = Q[i][1] - P[j][1];
long distSquared = dx * dx + dy * dy;
if (distSquared > maxDistSquared) {
maxDistSquared = distSquared;
}
}
if (maxDistSquared > maxRadiusSquared) {
maxRadiusSquared = maxDistSquared;
}
}
System.out.println(maxRadiusSquared);
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.