[BOJ] 2667. 단지번호붙이기(javascript)

레몬커드요거트·2026년 2월 2일

코딩테스트준비

목록 보기
18/66
post-thumbnail

실패

const fs = require("fs");

const input = fs
  .readFileSync(process.platform === "linux" ? "/dev/stdin" : "input.txt")
  .toString()
  .trim()
  .split("\n");

const N = input[0];

const maze = input.slice(1).map((line) => line.split("").map(Number));

console.log(N, maze);

let arr = []; // 단지의 수 저장하는 배열

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

let buildingNum = 1;
function bfs(startX, startY) {
  const queue = [[startX, startY]];
  while (queue.length > 0) {
    const [x, y] = queue.shift();
    for (let d = 0; d < 4; d++) {
      const nx = x + dx[d];
      const ny = y + dy[d];

      if (nx >= 0 && nx < N && ny >= 0 && ny < N) {
        if (maze[nx][ny] === 1) {
          maze[nx][ny] = 0; // 방문 처리
          **queue.push([nx, ny]);**
          buildingNum++; // 단지수 카운팅
        }
      }
    }
  }
  return buildingNum;
}

for (let j = 0; j < N; j++) {
  for (let i = 0; i < N; i++) {
    if (maze[i][j] === 1) {
      arr.push(bfs(i, j));
    }
  }
}

console.log(arr);

성공

 maze[startX][startY] = 0; // 시작하자마자 0으로 만들어 중복 방지
 let buildingNum = 1; // 함수 안에서 선언하여 매번 1부터 시작
  • 시작점을 0으로 바꿔야하는데 1로 그대로 두었음
  • 카운팅변수를 새로 초기화 시켜줘야하는데 함수 밖에서 선언해 누적이 되었음
const fs = require("fs");

const input = fs
  .readFileSync(process.platform === "linux" ? "/dev/stdin" : "input.txt")
  .toString()
  .trim()
  .split("\n");

const N = input[0];

const maze = input.slice(1).map((line) => line.split("").map(Number));

console.log(N, maze);

let arr = []; // 단지의 수 저장하는 배열

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

function bfs(startX, startY) {
  const queue = [[startX, startY]];
  maze[startX][startY] = 0; // 시작하자마자 0으로 만들어 중복 방지
  let buildingNum = 1; // 함수 안에서 선언하여 매번 1부터 시작
  while (queue.length > 0) {
    const [x, y] = queue.shift();
    for (let d = 0; d < 4; d++) {
      const nx = x + dx[d];
      const ny = y + dy[d];

      if (nx >= 0 && nx < N && ny >= 0 && ny < N) {
        if (maze[nx][ny] === 1) {
          maze[nx][ny] = 0; // 방문 처리
          queue.push([nx, ny]);
          buildingNum++; // 단지수 카운팅
        }
      }
    }
  }
  return buildingNum;
}

for (let j = 0; j < N; j++) {
  for (let i = 0; i < N; i++) {
    if (maze[i][j] === 1) {
      arr.push(bfs(i, j));
    }
  }
}

console.log(arr.length);
console.log(arr.sort((x, y) => x - y).join("\n"));

개발스킬

bfs에서의 queue.push

queue.push([nx, ny]);

지금 찾은 집을 기준으로 나중에 그 주변(상하좌우)을 또 탐색하기 위해서

  1. (startX, startY)에서 출발해서 주변에 있는 집 (nx, ny)를 찾음
  2. 다음 차례에는 방금 찾은 (nx, ny)에 서서 그 주변을 또 살펴봐야 단지 전체를 훑을 수 있음
  3. queue.push는 "다음에 탐색할 후보 명단"에 이 좌표를 예약해두는 행위
    • push: "새로 발견한 집이네? 너 여기 줄 서 있어. 앞에 있는 애들 끝나면 네 차례야."
    • shift (또는 head++): "줄 맨 앞에 있는 사람 나오세요. 이제 당신 주변에 집이 있는지 확인해보자

*push를 해야만 꼬리에 꼬리를 무는 탐색이 가능해져서, 떨어져 있는 집이 아닌 연결된 모든 집을 끝까지 찾아낼 수 있습니다!*

shift대신 인덱스 참조하기

let head = 0;
  while (queue.length > head) {
    const [x, y] = queue[head++]; // shift() 대신 인덱스 참조로 속도 향상

집의 갯수 카운팅은 시작부터 1

let buildingNum = 1;

profile
비요뜨 최고~

0개의 댓글