N 개의 막대 기둥이 일렬로 세워져 있다. 기둥들의 폭은 모두 1 m이며 높이는 다를 수 있다. 이 기둥들을 이용하여 양철로 된 창고를 제작하려고 한다. 창고에는 모든 기둥이 들어간다. 이 창고의 지붕을 다음과 같이 만든다.
그림 1은 창고를 옆에서 본 모습을 그린 것이다. 이 그림에서 굵은 선으로 표시된 부분이 지붕에 해당되고, 지붕과 땅으로 둘러싸인 다각형이 창고를 옆에서 본 모습이다. 이 다각형을 창고 다각형이라고 하자.

창고 주인은 창고 다각형의 면적이 가장 작은 창고를 만들기를 원한다. 그림 1에서 창고 다각형의 면적은 98 ㎡이고, 이 경우가 가장 작은 창고 다각형이다.
기둥들의 위치와 높이가 주어질 때, 가장 작은 창고 다각형의 면적을 구하는 프로그램을 작성하시오.
첫 줄에는 기둥의 개수를 나타내는 정수 N이 주어진다. N은 1 이상 1,000 이하이다. 그 다음 N 개의 줄에는 각 줄에 각 기둥의 왼쪽 면의 위치를 나타내는 정수 L과 높이를 나타내는 정수 H가 한 개의 빈 칸을 사이에 두고 주어진다. L과 H는 둘 다 1 이상 1,000 이하이다.
첫 줄에 창고 다각형의 면적을 나타내는 정수를 출력한다.
7
2 4
11 4
15 8
4 6
5 3
8 10
13 6
98
const fs = require('fs');
let [N, ...column] = fs.readFileSync(0, 'utf-8').toString().trim().split('\n');
N = Number(N);
for (let i = 0; i < N; i++) {
column[i] = column[i].trim().split(' ').map(Number);
}
column.sort((a, b) => {
if (a[0] > b[0]) return 1;
else return -1;
});
let max = column.reduce(
(acc, array) => {
const value = array[1];
if (value > acc.maxHeight) {
return {
maxHeight: value,
maxIndex: array[0],
};
}
return acc;
},
{ maxHeight: 0, maxIndex: null }
);
let index = 0;
let height = Array.from({ length: column[column.length - 1][0] }, () => null);
for (let i = column[0][0]; i <= max.maxIndex; i++) {
if (column[index][0] !== i) {
height[i] = height[i - 1];
} else {
if (column[index][1] < height[i - 1]) {
height[i] = height[i - 1];
} else if (column[index][1] > height[i - 1]) {
height[i] = column[index][1];
} else {
height[i] = height[i - 1];
}
index++;
}
}
index = column.length - 1;
for (let i = column[column.length - 1][0]; i > max.maxIndex; i--) {
if (column[index][0] !== i) {
height[i] = height[i + 1];
} else {
if (column[index][1] < height[i + 1]) {
height[i] = height[i + 1];
} else if (column[index][1] > height[i + 1]) {
height[i] = column[index][1];
} else {
if (i === column[column.length - 1][0]) height[i] = column[index][1];
else height[i] = height[i + 1];
}
index--;
}
}
let sum = 0;
for (let i = 0; i < height.length; i++) {
if (height[i]) sum += height[i];
}
console.log(sum);
풀어쓰면 정말 난해하긴 한데 그림으로 보고 풀면 그래도 금방 방법이 떠올랐던 문제였다. 알고리즘 떠올리는 것보다 2차원 배열에서 최대 높이와 최대 높이의 위치를 찾는 게 더 번거로웠던 것 같다. reduce를 자주 안썼는데 잘쓰면 유용하게 쓰일 것 같다.