본문 바로가기

백준 코딩 테스트

자바스크립트용 bfs 탬플릿 코드

728x90
const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = [];

rl.on("line", (line) => {
  input.push(line);
});

rl.on("close", () => {
  const result = solution(input);

  for (let i = 0; i < result.length; i++) {
    console.log(result[i]);
  }

  process.exit(0);
});

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

function bfs(x, y, n, m, maps, visited) {
  q = [];
  q.push([x, y]);
  let extent = 0;

  while (q.length !== 0) {
    const [x, y] = q.shift();
    extent += 1;
    visited[x][y] = true;

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

      if (0 <= nx && nx < n && 0 <= ny && ny < m) {
        if (maps[nx][ny] === 1 && visited[nx][ny] === false) {
          q.push([nx, ny]);
          visited[nx][ny] = true;
        }
      }
    }
  }

  return extent;
}

function solution(input) {
  const [n, m] = input[0].split(" ").map(Number);
  const maps = input.slice(1).map((line) => line.split(" ").map(Number));
  let visited = Array.from({ length: n }, () => new Array(m).fill(false));
  let cnt = 0;
  let extents = [];
  let answer = [];

  for (let i = 0; i < n; i++) {
    for (let j = 0; j < m; j++) {
      if (maps[i][j] === 1 && visited[i][j] === false) {
        const extent = bfs(i, j, n, m, maps, visited);
        extents.push(extent);
        cnt += 1;
      }
    }
  }

  answer.push(cnt);
  answer.push(cnt === 0 ? 0 : Math.max(...extents));
  return answer;
}
728x90