[백준 14716] 현수막 with node.js

waterglasses·2021년 9월 13일
0
post-thumbnail

📌 문제링크

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

📌 풀이

  • 현수막 내부의 모든 글자의 개수를 찾는 문제
  • BFS로 글자인 부분(1)만 탐색하면서 서로 연결되어 있을 때만 cntOfWord를 추가

📌 코드

const fs = require('fs');
const stdin = (
  process.platform === 'linux'
    ? fs.readFileSync('/dev/stdin').toString().trim()
    : `8 19
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 1 0 0 0 1 0 1 1 1 1 1 0
0 0 1 0 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0
0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 0 0
0 1 1 1 1 1 0 1 0 1 0 1 0 0 0 1 0 0 0
0 1 0 0 0 1 0 1 0 0 1 1 0 0 0 1 0 0 0
0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0`
).split('\n');

const input = (() => {
  let line = 0;
  return () => stdin[line++];
})();

const traversalInBannerByBFS = (startX, startY) => {
  let queue = [[startX, startY]];
  let queueCursor = 0;

  let dx = [0, 0, 1, -1, 1, 1, -1, -1];
  let dy = [1, -1, 0, 0, -1, 1, 1, -1];

  while (queue.length > queueCursor) {
    let [x, y] = queue[queueCursor++];

    for (let i = 0; i < 8; i++) {
      let nx = x + dx[i];
      let ny = y + dy[i];

      if (nx < 0 || nx >= M || ny < 0 || ny >= N) continue;
      if (!banner[nx][ny]) continue;

      banner[nx][ny] = 0;
      queue.push([nx, ny]);
    }
  }
};

const [M, N] = input().split(' ').map(Number);
const banner = Array.from(new Array(M), () => input().split(' ').map(Number));
let cntOfWord = 0;

for (let i = 0; i < M; i++) {
  for (let j = 0; j < N; j++) {
    if (!banner[i][j]) continue;

    cntOfWord += 1;
    traversalInBannerByBFS(i, j);
  }
}

console.log(cntOfWord);
profile
매 순간 성장하는 개발자가 되려고 노력하고 있습니다.

0개의 댓글