티스토리 뷰

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

 

18808번: 스티커 붙이기

혜윤이는 최근에 다양한 대회를 참여하면서 노트북에 붙일 수 있는 스티커들을 많이 받았다. 스티커는 아래와 같이 사각 모눈종이 위에 인쇄되어 있으며, 스티커의 각 칸은 상하좌우로 모두 연

www.acmicpc.net

const input = require('fs')
	.readFileSync('./dev/stdin')
	.toString()
	.trim()
	.split('\n')
	.map((v) => v.split(' ').map(Number));
const [N, M, K] = input.shift();
let board = Array.from(Array(N), () => Array(M).fill(0));
let stickers = Array.from(Array(K), () => []);
for (let k = 0; k < K; k++) {
	const [r] = input.shift();
	for (let x = 0; x < r; x++) {
		stickers[k].push(input.shift());
	}

	stickers[k] = [...rotate(stickers[k])];
}

function rotate(sticker) {
	const result = [sticker];

	for (let i = 1; i <= 3; i++) {
		const prev = result[i - 1];
		const r = prev.length;
		const c = prev[0].length;
		let rotateSticker = Array.from(Array(c), () => Array(r).fill(0));
		for (let i = 0; i < r; i++) {
			for (let j = 0; j < c; j++) {
				rotateSticker[j][r - i - 1] = prev[i][j];
			}
		}
		result.push(rotateSticker);
	}
	return result;
}

for (let s = 0; s < stickers.length; s++) {
	const sticker = stickers[s];

	for (let k = 0; k < 4; k++) {
		const didPutOn = tryPut(sticker[k]);
		if (didPutOn) break;
	}
}

console.log(
	board.flat().reduce((r, v) => {
		r = r + v;
		return r;
	}, 0)
);

function tryPut(sticker) {
	const r = sticker.length;
	const c = sticker[0].length;

	for (let i = 0; i <= N - r; i++) {
		for (let j = 0; j <= M - c; j++) {
			let possible = true;
			for (let x = 0; x < r; x++) {
				for (let y = 0; y < c; y++) {
					if (sticker[x][y] == 0) continue;
					if (board[i + x][j + y] == 1) {
						possible = false;
						break;
					}
				}
				if (!possible) break;
			}

			if (possible) {
				for (let x = 0; x < r; x++) {
					for (let y = 0; y < c; y++) {
						if (sticker[x][y] == 1) board[i + x][j + y] = 1;
					}
				}
				return true;
			}
		}
	}
	return false;
}
728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함