[백준] 마인크래프트

상현·2023년 11월 6일
1

코딩테스트

목록 보기
12/30
post-thumbnail

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로 채워지는게 옳은 알고리즘이다. 결국, 모든 높이를 검사해야 했다.

profile
프론트엔드 개발자

0개의 댓글