본문 바로가기
코딩테스트(알고리즘)/baekjoon

[baekjoon] 18111 마인크래프트 (Javascript)

by Cafe Mocha 2022. 6. 23.

18111번: 마인크래프트 (acmicpc.net)

 

18111번: 마인크래프트

팀 레드시프트는 대회 준비를 하다가 지루해져서 샌드박스 게임인 ‘마인크래프트’를 켰다. 마인크래프트는 1 × 1 × 1(세로, 가로, 높이) 크기의 블록들로 이루어진 3차원 세계에서 자유롭게

www.acmicpc.net


접근 : BF

 

수식으로 접근했을 때는 정말 어렵게 접근했다.

컴퓨터의 연산능력을 믿고 BF를 돌리니 통과.

 

TIME의 초기값을 99999999 정도로 잡았더니 계속해서 틀렸다고 나왔다.

알고 보니 초기값을 더 크게 잡았어야 했던 것...

앞으로는 Infinity로 설정해야겠다.

 

Javascript

let input = require("fs")
  .readFileSync("input.txt") //"/dev/stdin"
  .toString()
  .split("\n")
  .map((val) => val.trim());

function solution(input) {
  let [n, m, b] = input
    .shift()
    .split(" ")
    .map((v) => +v);
  let map = [];
  let Max = -99999;
  let Min = 99999;
  for (let i = 0; i < n; i++) {
    let temp = input
      .shift()
      .split(" ")
      .map((v) => +v);
    let max = Math.max(...temp);
    let min = Math.min(...temp);

    Max = Math.max(Max, max);
    Min = Math.min(Min, min);

    map.push(temp);
  }

  let time = Infinity;
  let height = 0;

  for (let h = Max; h >= Min; h--) {
    let t = 0;
    let bag = b;
    for (let a = 0; a < n; a++) {
      for (let b = 0; b < m; b++) {
        if (map[a][b] === h) continue;
        else if (map[a][b] > h) {
          t += (map[a][b] - h) * 2;
          bag += map[a][b] - h;
        } else {
          t += h - map[a][b];
          bag -= h - map[a][b];
        }
      }
    }
    if (bag < 0) continue;

    if (t <= time) {
      if (t === time && h < height) {
        time = t;
      } else {
        time = t;
        height = h;
      }
    }
  }

  let answer = [time, height].join(" ");
  console.log(answer);
}
solution(input);