
const fs = require('fs');
const path = process.platform === 'linux' ? '/dev/stdin' : 'input.txt';
const map = fs
.readFileSync(path)
.toString()
.trim()
.split('\n')
.map((it) => it.split(' ').map(Number));
const [n, m] = map.shift();
const tetromino = [
// 민트
[
[0, 1, 2, 3],
[0, 0, 0, 0],
],
[
[0, 0, 0, 0],
[0, 1, 2, 3],
],
// 노랑
[
[0, 0, 1, 1],
[0, 1, 0, 1],
],
// 주황
[
[0, 1, 0, 0],
[0, 0, 1, 2],
],
[
[0, 0, 1, 2],
[0, 1, 1, 1],
],
[
[0, 0, 0, -1],
[0, 1, 2, 2],
],
[
[0, 1, 2, 2],
[0, 0, 0, 1],
],
// 대칭 주황
[
[0, 0, -1, -2],
[0, 1, 1, 1],
],
[
[0, 1, 1, 1],
[0, 0, 1, 2],
],
[
[0, 1, 2, 0],
[0, 0, 0, 1],
],
[
[0, 0, 0, 1],
[0, 1, 2, 2],
],
// 초록
[
[0, 1, 1, 2],
[0, 0, 1, 1],
],
[
[0, 0, -1, -1],
[0, 1, 1, 2],
],
// 대칭초록
[
[0, 1, 0, -1],
[0, 0, 1, 1],
],
[
[0, 0, 1, 1],
[0, 1, 1, 2],
],
// 핑크
[
[0, 0, 1, 0],
[0, 1, 1, 2],
],
[
[0, 1, 2, 1],
[0, 0, 0, 1],
],
[
[0, -1, 0, 1],
[0, 1, 1, 1],
],
[
[0, 0, 0, -1],
[0, 1, 2, 1],
],
];
const getTetrominoScore = (x, y, dx, dy) => {
let sum = 0;
for (let i = 0; i < 4; i++) {
const nx = x + dx[i];
const ny = y + dy[i];
if (nx < 0 || ny < 0 || nx >= n || ny >= m) return 0;
else sum += map[nx][ny];
}
return sum;
};
let max = 0;
for (let i = 0; i < n; i++) {
for (let j = 0; j < m; j++) {
for (const [dx, dy] of tetromino) {
const score = getTetrominoScore(i, j, dx, dy);
if (score > max) max = score;
}
}
}
console.log(max);
⏰ 소요한 시간 : -
대칭 요소를 생각 안해서 한참 헤맸다....ㅠ.ㅠ 너무 당연하게 테트리스대로만 생각한듯
일단 모든 경우의 수를 좌표로 처리할 수 있도록 x와 y 오프셋 값을 배열형태로 만들어 줬다.
그 후 맵의 모든 좌표에서 총 19개의 테트로미노를 해당 좌표에 놓는것이 가능한지 확인한 후 가능하다면 합계를 리턴하고 최대값을 구해주었다.