문제 출처: https://www.acmicpc.net/problem/2304
문제
N 개의 막대 기둥이 일렬로 세워져 있다. 기둥들의 폭은 모두 1 m이며 높이는 다를 수 있다. 이 기둥들을 이용하여 양철로 된 창고를 제작하려고 한다. 창고에는 모든 기둥이 들어간다. 이 창고의 지붕을 다음과 같이 만든다.
그림 1은 창고를 옆에서 본 모습을 그린 것이다. 이 그림에서 굵은 선으로 표시된 부분이 지붕에 해당되고, 지붕과 땅으로 둘러싸인 다각형이 창고를 옆에서 본 모습이다. 이 다각형을 창고 다각형이라고 하자.
창고 주인은 창고 다각형의 면적이 가장 작은 창고를 만들기를 원한다. 그림 1에서 창고 다각형의 면적은 98 ㎡이고, 이 경우가 가장 작은 창고 다각형이다.
기둥들의 위치와 높이가 주어질 때, 가장 작은 창고 다각형의 면적을 구하는 프로그램을 작성하시오.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
private static class Pole implements Comparable<Pole> {
int x;
int y;
public Pole(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public int compareTo(Pole o) {
return this.x - o.x;
}
}
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(reader.readLine()); // 기둥의 개수
List<Pole> poleList = new ArrayList<>();
for (int i = 0; i < N; i++) {
StringTokenizer tokenizer = new StringTokenizer(reader.readLine());
int x = Integer.parseInt(tokenizer.nextToken());
int y = Integer.parseInt(tokenizer.nextToken());
poleList.add(new Pole(x, y));
}
Collections.sort(poleList);
int maxY = 0; // 가장 높은 기둥
int index = 0; // 가장 높은 기둥의 인덱스
// 가장 높은 기둥 찾기
for (int i = 0, size = poleList.size(); i < size; i++) {
if (poleList.get(i).y > maxY) {
maxY = poleList.get(i).y;
index = i;
}
}
int area = 0; // 넓이를 저장하는 변수
int leftY = poleList.get(0).y; // 왼쪽 끝 기둥
int leftX = poleList.get(0).x; // x 좌표 위치
for (int i = 1; i <= index; i++) {
if (leftY <= poleList.get(i).y) {
area += leftY * (poleList.get(i).x - leftX);
leftY = poleList.get(i).y;
leftX = poleList.get(i).x;
}
}
int rightY = poleList.get(poleList.size() - 1).y; // 오른쪽 끝 기둥
int rightX = poleList.get(poleList.size() - 1).x; // x 좌표 위치
for (int i = poleList.size() - 2; i >= index; i--) {
if (rightY <= poleList.get(i).y) {
area += rightY * (rightX - poleList.get(i).x);
rightY = poleList.get(i).y;
rightX = poleList.get(i).x;
}
}
area += maxY;
System.out.println(area);
}
}