Baekjoon

Baekjoon 1997번 박스포장

ppwag 2022. 6. 2. 02:42

문제

https://www.acmicpc.net/problem/1997

걸린 시간

02 : 00 : 00

풀이

JavaScript

const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input';
const stdin = fs.readFileSync(filePath).toString().trim().split('\n').map(s => s.trim());
const input = (() => {
  let line = 0;
  return () => stdin[line++];
})();

const [n, w, b] = input().split(' ').map(Number);

let arr = Array.from(Array(b), () => Array(w).fill('.'));

// 한칸을 내린다
const fill = (idx, h, tmp) => {
  if(idx){
    for(let j = 0; j < w; j++){
      if(arr[idx-1][j] !== 'O') arr[idx-1][j] = '.';
    }
  }
  for(let i = idx; i < h+idx; i++){
    for(let j = 0; j < w; j++){
      if(arr[i][j] !== 'O') arr[i][j] = tmp[i-idx][j];
    }
  }
}

// 한칸 더 내릴 수 있는지 검사
const chk = (idx, h) => {
  for(let i = idx; i < h+idx; i++){
    for(let j = 0; j < w; j++){
      if(i+1 < b && arr[i][j] === 'X' && arr[i+1][j] === 'O'){
        return false;
      }
    }
  }
  return true;
}

const fix = () => {
  for(let i = 0; i < b; i++){
    for(let j = 0; j < w; j++){
      if(arr[i][j] === 'X') arr[i][j] = 'O';
    }
  }
}

let ans = '';
for(let i = 0; i < n; i++){
  const h = parseInt(input());
  const tmp = [];
  for(let j = 0; j < h; j++){
    tmp.push(input().split(''));
  }
  let valid = true;
  for(let j = 0; j < h; j++){
    for(let k = 0; k < w; k++){
      if(arr[j][k] === 'O' && tmp[j][k] === 'X') valid = false;
    }
  }
  if(!valid){
    let j = 0;
    for(; j < b; j++){
      if(arr[j].includes('O')) break;
    }
    ans += `${b-j} `;
    arr = Array.from(Array(b), () => Array(w).fill('.'));
  }
  fill(0, h, tmp);
  for(let j = 0; j < b-h; j++){
    if(chk(j, h)){
      fill(j+1, h, tmp);
    }
    else{
      break;
    }
  }
  fix();
}

let j = 0;
let O = false;
for(; j < b; j++){
  if(arr[j].includes('O')){
    O = true;
    break;
  }
}
if(O) ans += `${b-j} `;

console.log(ans);

시뮬레이션 문제이다. 이번에도 문제를 제멋대로 이해하고 푸는 바람에 시간이 오래 걸렸다.

장식판의 너비 w 가 고정된다고 해서 모든 장식판의 너비가 모두 w 일 것이라고 생각했다.

테트리스를 하듯이 장식판을 맨 위에서부터 박스에 담을 수 있는지 검사하면서 높이 1 씩 내려가면 된다.

구현을 할 때 차례로 물건을 담기 때문에 이미 담은 물건을 구분해야 하므로 이전의 물건들은 전부 X 에서 O 로 바꾸어주었다.

설계가 완벽하지 않은 상태로 주먹구구식 구현을 하다 보니깐 TypeError 도 마주하고 시뮬레이션이 완전 꼬여버리는 등 삽질을 엄청 오래해서 힘들었다. (JavaScript 에서의 TypeError 는 잘못된 참조가 일어나면 런타임 에러가 발생하는 대신 undefined 가 할당되어 연산 과정에서 오류가 발생하는 듯 하다.)

'Baekjoon' 카테고리의 다른 글

Baekjoon 1783번 병든 나이트  (0) 2022.08.27
Baekjoon 17425번 약수의 합  (0) 2022.07.06
Baekjoon 18428번 감시 피하기  (0) 2022.05.31
Baekjoon 11057번 오르막 수  (0) 2022.05.27
Baekjoon 1495번 기타리스트  (0) 2022.05.17

댓글