문제
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 |
댓글