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부터 시작
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"));
queue.push([nx, ny]);
지금 찾은 집을 기준으로 나중에 그 주변(상하좌우)을 또 탐색하기 위해서
(startX, startY)에서 출발해서 주변에 있는 집 (nx, ny)를 찾음(nx, ny)에 서서 그 주변을 또 살펴봐야 단지 전체를 훑을 수 있음queue.push는 "다음에 탐색할 후보 명단"에 이 좌표를 예약해두는 행위push: "새로 발견한 집이네? 너 여기 줄 서 있어. 앞에 있는 애들 끝나면 네 차례야."shift (또는 head++): "줄 맨 앞에 있는 사람 나오세요. 이제 당신 주변에 집이 있는지 확인해보자
*push를 해야만 꼬리에 꼬리를 무는 탐색이 가능해져서, 떨어져 있는 집이 아닌 연결된 모든 집을 끝까지 찾아낼 수 있습니다!*
let head = 0;
while (queue.length > head) {
const [x, y] = queue[head++]; // shift() 대신 인덱스 참조로 속도 향상
let buildingNum = 1;