📖 https://www.acmicpc.net/problem/2667
이 문제에서 필요한 조건들
- 시작점을 기준으로 4가지 좌표들을 탐색한다.
for(let j = 0; j < 4; j++) {
let nx = X[0] + dx[j];
let ny = X[1] + dy[j];
if(( nx >= 0 &&
ny >= 0 &&
nx < arr.length &&
ny < arr.length ) &&
// 좌표의 유효성 확인
(arr[nx][ny] === 1) &&
// 1일 경우에만 진행되므로 1인 경우만 좌표 출력
(!visited[[nx,ny]])
// 함수로 만들어보는게 좋았을 것 같지만 문제를 풀땐 이런식으로 좌표의 유효성을 확인했다.
BFS의 기본 진행을 맞춘다.
- BFS의 탐색을 진행해 queue와 visited객체를 선언한다.
- 위의 조건들을 만족하는 좌표면 queue에 삽입한다.
- vistied여부가 결정되면, cnt를 증가시킨다.
function bfs(x, y) {
const queue = [[x,y]];
const visited = {};
visited[[x,y]] = true;
let dx = [0, 0, 1, -1];
let dy = [-1, 1, 0, 0];
let cnt = 1;
while(queue.length) {
for(let j = 0; j < 4; j++) {
let nx = X[0] + dx[j];
let ny = X[1] + dy[j];
if(( // 좌표의 유효성을 확인하는 부분
)
{
visited[[nx,ny]] = true;
visitedCoords[[nx,ny]] = true;
cnt++;
queue.push([nx,ny]);
}
}
}
}
return cnt;
}
위의 방식으로 진행하면 queue의 push되는 한가지 값이 아니다.
for(let i=0; i<queue.length; i++) {
let X = queue.shift();
// queue에 있는 모든 값에 적용한다.
// 좌표의 유효성을 확인하고 -1번
// 유효한 좌표만 queue에 넣는다 - 3번
}
const input = require('fs').readFileSync('example.txt').toString().trim().split('\n');
const N = input.shift();
const arr = input.map((item) => item.split('').map(Number))
function bfs(x, y) {
const queue = [[x,y]];
const visited = {};
visited[[x,y]] = true;
visitedCoords[[x,y]] = true;
let dx = [0, 0, 1, -1];
let dy = [-1, 1, 0, 0];
let cnt = 1;
while(queue.length) {
for(let i=0; i<queue.length; i++) {
let X = queue.shift();
for(let j = 0; j < 4; j++) {
let nx = X[0] + dx[j];
let ny = X[1] + dy[j];
if(( nx >= 0 &&
ny >= 0 &&
nx < arr.length &&
ny < arr.length ) &&
// 좌표의 유효성 확인
(arr[nx][ny] === 1) &&
// 1일 경우에만 진행되므로 1인 경우만 좌표 출력
(!visited[[nx,ny]])
// visited 확인
)
{
visited[[nx,ny]] = true;
visitedCoords[[nx,ny]] = true;
cnt++;
queue.push([nx,ny]);
}
}
}
}
return cnt;
}
// 정답 출력을 위해 좌표를 순회할때, 중복된 좌표를 순회하지 않기 위해서 추가로 삽입한 객체
// 여기서, ture로 지정된 좌표는 더이상 순회하지 않는다.
const visitedCoords = {};
const answer = [];
for(let i=0; i<N; i++) {
for(let j=0; j<N; j++) {
if(arr[i][j] === 1 && !visitedCoords[[i,j]]) answer.push(bfs(i,j));
}
}
console.log(answer.length);
answer.sort((a,b) => a-b)
answer.forEach((item) => console.log(item));