[백준14500_자바스크립트(javascript)] - 테트로미노

경이·2024년 9월 29일

𝑩𝑶𝑱 (𝒋𝒔)

목록 보기
197/325

🔴 문제

테트로미노


🟡 Sol

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);

🟢 풀이

⏰ 소요한 시간 : -

대칭 요소를 생각 안해서 한참 헤맸다....ㅠ.ㅠ 너무 당연하게 테트리스대로만 생각한듯
일단 모든 경우의 수를 좌표로 처리할 수 있도록 xy 오프셋 값을 배열형태로 만들어 줬다.
그 후 맵의 모든 좌표에서 총 19개의 테트로미노를 해당 좌표에 놓는것이 가능한지 확인한 후 가능하다면 합계를 리턴하고 최대값을 구해주었다.


🔵 Ref

profile
록타르오가르

0개의 댓글