해당 문제는 bfs, dfs를 모두 사용해서 풀었다.
bfs
const bfs = (map, visited, x, y) => {
let queue = [];
visited[x][y] = 1;
queue.push([x, y]);
while (queue.length !== 0) {
let [cx, cy] = queue.shift();
for (let dir = 0; dir < 4; dir++) {
let nx = cx + dx[dir];
let ny = cy + dy[dir];
if (nx < 0 || nx >= map.length || ny < 0 || ny >= map[0].length) continue;
if (map[nx][ny] === 0 || visited[nx][ny] === 1) continue;
visited[nx][ny] = 1;
queue.push([nx, ny]);
}
}
};
최단 거리 등의 문제에서 많이 활용
dfs
const dfs = (map, visited, x, y) => {
visited[x][y] = 1;
for (let dir = 0; dir < 4; dir++) {
let nx = x + dx[dir];
let ny = y + dy[dir];
if (nx < 0 || nx >= map.length || ny < 0 || ny >= map[0].length) continue;
if (map[nx][ny] === 0 || visited[nx][ny] === 1) continue;
dfs(map, visited, nx, ny);
}
};
완전 탐색에서 많이 활용
let input = require("fs")
.readFileSync("input.txt") //"/dev/stdin"
.toString()
.split("\n")
.map((val) => val.trim());
let dx = [1, 0, -1, 0];
let dy = [0, 1, 0, -1];
const bfs = (map, visited, x, y) => {
let queue = [];
visited[x][y] = 1;
queue.push([x, y]);
while (queue.length !== 0) {
let [cx, cy] = queue.shift();
for (let dir = 0; dir < 4; dir++) {
let nx = cx + dx[dir];
let ny = cy + dy[dir];
if (nx < 0 || nx >= map.length || ny < 0 || ny >= map[0].length) continue;
if (map[nx][ny] === 0 || visited[nx][ny] === 1) continue;
visited[nx][ny] = 1;
queue.push([nx, ny]);
}
}
};
const dfs = (map, visited, x, y) => {
visited[x][y] = 1;
for (let dir = 0; dir < 4; dir++) {
let nx = x + dx[dir];
let ny = y + dy[dir];
if (nx < 0 || nx >= map.length || ny < 0 || ny >= map[0].length) continue;
if (map[nx][ny] === 0 || visited[nx][ny] === 1) continue;
dfs(map, visited, nx, ny);
}
};
function solution() {
let t = +input.shift();
while (t--) {
let [m, n, k] = input
.shift()
.split(" ")
.map((v) => +v);
let map = new Array(n).fill().map((v) => new Array(m).fill(0));
let visited = new Array(n).fill().map((v) => new Array(m).fill(0));
let count = 0;
for (let i = 0; i < k; i++) {
let [x, y] = input
.shift()
.split(" ")
.map((v) => +v);
map[y][x] = 1;
}
for (let i = 0; i < n; i++) {
for (let j = 0; j < m; j++) {
if (map[i][j] === 1 && visited[i][j] === 0) {
dfs(map, visited, i, j);
count++;
}
}
}
console.log(count);
}
}
solution();
'코딩테스트(알고리즘) > baekjoon' 카테고리의 다른 글
[baekjoon] 2583 영역 구하기 (javascript) (2) | 2023.01.11 |
---|---|
[beakjoon] 2468 안전 영역 (javascript) (0) | 2023.01.11 |
[baekjoon] 3986 좋은 단어(javascript) (0) | 2023.01.06 |
[baekjoon] 14889 스타트와 링크 (0) | 2022.11.09 |
[baekjoon] 10819 차이를 최대로 (0) | 2022.11.08 |