https://www.acmicpc.net/problem/18111
let fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
const [N, M, B] = input.shift().split(" ").map(Number);
// N x M 2차원 배열을 1차원 배열로 바꾼다. (어차피 다 돌면서 검사해야함)
let flatArr = [];
for (const element of input) {
element.split(" ").forEach(item => {
flatArr.push(Number(item));
})
}
// 높이가 큰 순서로 정렬 한다.
flatArr.sort((a, b) => b - a);
let answerArray = [];
// 가능한 최소 높이부터 최대 높이까지 다 검사한다.
for (let height = 0; height <= 256; height++) {
let time = 0;
let inventory = B;
for (let j = 0; j < flatArr.length; j++) {
const item= flatArr[j];
if (item > height) {
time += (2 * (item - height));
inventory += (item - height);
} else if (item < height) {
time += height - item;
inventory -= height - item;
// 인벤토리에 여유 블록이 없으면 실패!
if (inventory < 0) break;
}
if (j === flatArr.length - 1) {
answerArray.push([time, height])
}
}
}
// 최소 시간을 찾아낸다.
const answer = answerArray.reduce((acc, cur) => {
if (cur[0] < acc[0]) {
return cur;
} else if (cur[0] === acc[0]) {
if (cur[1] > acc[1]) return cur;
return acc;
}
return acc;
}, [Number.MAX_VALUE, 0])
console.log(answer.join(" "))
처음에는 주어진 높이 중 하나로 채우면 된다는 생각으로 진행하였다. 그래서 Set
으로 주어진 높이의 중복을 제거하고, 그 중에서만 for
문을 돌았다.
근데 [0 0 0 0 256 256 256 256]
같이 극단적인 경우면 중간인 128로 채워지는게 옳은 알고리즘이다. 결국, 모든 높이를 검사해야 했다.