옥구슬의 여러 지점이 있을 때, 가장 크고작은 x, y를 찾아서 넓이를 계산하면 되는 문제이다.
예시로 살펴보자면 아래와 같다.
동 : x좌표가 제일 큰 것
서 : x좌표가 제일 작은 것
남 : y좌표가 제일 작은 것
북 : y좌표가 제일 큰 것
따라서, 좌표들을 입력받은 후 가장 크고작은 x, y를 찾아주면 된다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class P9063 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
List<Point> list = new ArrayList<>(); // 입력받은 좌표들의 목록
for (int i = 0; i < N; i++) {
int[] xy = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
list.add(new Point(xy[0], xy[1])); // 좌표 객체를 만들어 목록에 추가
}
if (list.size() <= 1) // 지점이 1개라면 넓이는 0, 2개 이상이어야 직사각형을 만들 수 있음
System.out.println(0);
else {
// 주의! min, max값을 0으로 설정해주면 좌표가 음수일 경우 계산값이 올바르지 않으므로 주의해야 함.
int east = list.get(0).getX();
int west = list.get(0).getX();
int south = list.get(0).getY();
int north = list.get(0).getY();
for (Point p : list){
int x = p.getX();
int y = p.getY();
// 동 : x좌표가 제일 큰 것
// 서 : x좌표가 제일 작은 것
// 남 : y좌표가 제일 작은 것
// 북 : y좌표가 제일 큰 것
if (x > east) east = x;
if (x < west) west = x;
if (y < south) south = y;
if (y > north) north = y;
}
System.out.println((east - west) * (north - south));
}
}
}
class Point {
private final int x;
private final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return this.x;
}
public int getY() {
return this.y;
}
}
주의할 점 : min, max값을 0으로 설정해주면 좌표가 음수일 경우 계산값이 올바르지 않으므로 주의해야 한다.
개선할 점 : 가독성을 위해 객체를 생성하여 구현하였지만, x의 목록과 y의 목록 중 min, max값만 구하면 되므로 더 간단하게 구현해줄 수 있다. 또는 x와 y의 각 min max를 입력의 범위인 -10000, 10000으로 설정한 후 각 지점을 입력받을 때 min max를 비교한다면 더욱 더 간단해질 수 있다.
'백준' 카테고리의 다른 글
[Java] 백준 5073번 - 삼각형과 세 변 (0) | 2023.07.01 |
---|---|
[Java] 백준 10101번 - 삼각형 외우기 (0) | 2023.07.01 |
[Java] 백준 11005번 - 진법 변환 2 (0) | 2023.05.06 |
[Java] 백준 2338번 - 긴자리 계산 (0) | 2023.05.06 |
[Java] 백준 1271번 - 엄청난 부자2 (0) | 2023.05.06 |