창고 다각형
N 개의 막대 기둥이 일렬로 세워져 있다. 기둥들의 폭은 모두 1 m이며 높이는 다를 수 있다. 이 기둥들을 이용하여 양철로 된 창고를 제작하려고 한다. 창고에는 모든 기둥이 들어간다. 이 창고의 지붕을 다음과 같이 만든다.
- 지붕은 수평 부분과 수직 부분으로 구성되며, 모두 연결되어야 한다.
- 지붕의 수평 부분은 반드시 어떤 기둥의 윗면과 닿아야 한다.
- 지붕의 수직 부분은 반드시 어떤 기둥의 옆면과 닿아야 한다.
- 지붕의 가장자리는 땅에 닿아야 한다.
- 비가 올 때 물이 고이지 않도록 지붕의 어떤 부분도 오목하게 들어간 부분이 없어야 한다.
그림 1은 창고를 옆에서 본 모습을 그린 것이다. 이 그림에서 굵은 선으로 표시된 부분이 지붕에 해당되고, 지붕과 땅으로 둘러싸인 다각형이 창고를 옆에서 본 모습이다. 이 다각형을 창고 다각형이라고 하자.
그림1 . 기둥과 지붕(굵은 선)의 예
창고 주인은 창고 다각형의 면적이 가장 작은 창고를 만들기를 원한다. 그림 1에서 창고 다각형의 면적은 98 ㎡이고, 이 경우가 가장 작은 창고 다각형이다.
기둥들의 위치와 높이가 주어질 때, 가장 작은 창고 다각형의 면적을 구하는 프로그램을 작성하시오.
https://www.acmicpc.net/problem/2304
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int c = Integer.parseInt(sc.nextLine());
int[][] data = new int[c][];
for (int i = 0; i < c; i++) {
String[] temp = sc.nextLine().split(" ");
data[i] = new int[]{Integer.parseInt(temp[0]), Integer.parseInt(temp[1])};
}
var reuslt = solution(c, data);
}
public static int solution(int c, int[][] data) {
int result = 0;
Arrays.sort(data, (o1, o2) -> o1[0] - o2[0]);
int[] maxLength = data[0];
int maxLengthIndex = 0;
for (int i = 0; i < data.length; i++) {
int[] current = data[i];
if (maxLength[1] < current[1]) {
maxLength = current;
maxLengthIndex = i;
}
}
int[] temp = null;
for (int i = 0; i <= maxLengthIndex; i++) {
int[] current = data[i];
if (i == 0) {
temp = current;
continue;
}
if (current[1] >= temp[1]) {
result += temp[1] * (current[0] - temp[0]);
temp = current;
}
}
for (int i = data.length - 1; i >= maxLengthIndex; i--) {
int[] current = data[i];
if (i == data.length - 1) {
temp = current;
continue;
}
if (current[1] >= temp[1]) {
result += temp[1] * (temp[0] - current[0]);
temp = current;
}
}
result += maxLength[1];
System.out.println(result);
return 0;
}
}