๐ก๋ฌธ์ ๋ถ์ ์์ฝ
- ์
๋ ฅ: ์ฌ๋ฌ ๊ฐ์ ํ
์คํธ ์ผ์ด์ค๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ํ
์คํธ ์ผ์ด์ค๋ ๋ฐฐ์ถ๊ฐ ์ฌ์ด์ง ๊ฐ๋ก์ ์ธ๋ก ํฌ๊ธฐ(์ฆ, M x N ํฌ๊ธฐ), ๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ถ๊ฐ ์ฌ์ด์ง ์ขํ๋ค์ ๋ฆฌ์คํธ๊ฐ ์ฃผ์ด์ง๋ค.
- ๋ชฉํ: ์๋ก ์ธ์ ํ ๋ฐฐ์ถ๋ค(์, ํ, ์ข, ์ฐ)์ ํ ๊ตฐ์ง์ผ๋ก ๊ฐ์ฃผํ์ฌ, ๋ช ๊ฐ์ ๋ฐฐ์ถ ๊ตฐ์ง์ด ์๋์ง ์ธ๋ ๊ฒ์ด๋ค.
- ๊ทธ๋ํ ํ์: ์ธ์ ํ ๋ฐฐ์ถ๋ค๋ผ๋ฆฌ ์ฐ๊ฒฐ๋ ๋ถ๋ถ์ ๊ทธ๋ํ์ ๋
ธ๋๋ก ๋ณด๊ณ , DFS ๋๋ BFS๋ฅผ ์ฌ์ฉํด ๊ตฐ์ง์ ์ฐพ๋๋ค.
๐ก์๊ณ ๋ฆฌ์ฆ ์ค๊ณ
- ๊ทธ๋ํ ํํ
- 2์ฐจ์ ๋ฐฐ์ด์ ์ด์ฉํด ๋ฐฐ์ถ๊ฐ ์ฌ์ด์ง ์ขํ๋ฅผ ํํํ๋ค.
- ๋ฐฐ์ถ๊ฐ ์ฌ์ด์ง ๊ณณ์
1
, ๋ฐฐ์ถ๊ฐ ์๋ ๊ณณ์ 0
์ผ๋ก ํ์ํ๋ค.
- DFS/BFS ํ์
- ๊ฐ ๋ฐฐ์ถ ์ขํ์์ ์, ํ, ์ข, ์ฐ๋ก ์ธ์ ํ ๋ฐฐ์ถ๊ฐ ์๋์ง ํ์ธํ์ฌ ๋ฐฉ๋ฌธํ์ง ์์ ๋ฐฐ์ถ๋ค์ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌํ๋ค.
- ํ๋์ ๋ฐฐ์ถ์์ ์์ํด ์ธ์ ํ ๋ฐฐ์ถ๋ค์ ๋ชจ๋ ํ์ํ ํ, ๊ตฐ์ง์ ์ธ๊ธฐ ์ํด ๊ตฐ์ง ์นด์ดํฐ๋ฅผ ์ฆ๊ฐ์ํจ๋ค.
- ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
- ๋ฐฉ๋ฌธํ ๋ฐฐ์ถ๋ ๋ค์ ๋ฐฉ๋ฌธํ์ง ์๋๋ก ์ฒ๋ฆฌํ๋ค
(๋ฐฉ๋ฌธ ๋ฐฐ์ด์ ์ฌ์ฉํ๊ฑฐ๋ ๊ฐ์
0
์ผ๋ก ๋ณ๊ฒฝ)
- ํ์ ์๋ฃ ํ ๊ตฐ์ง ์ ์นด์ดํธ
- ๋ชจ๋ ์ขํ์ ๋ํด DFS/BFS๋ฅผ ์ํํ๊ณ , ํ์์ ๋ง์น ํ ๊ตฐ์ง ์๋ฅผ ์ถ๋ ฅํ๋ค.
๐ก์ฝ๋
const fs = require('fs');
const path = require('path');
const input = fs.readFileSync(path.join(__dirname, 'input.txt')).toString().trim().split('\\n');
function solution(input) {
// ์ฒซ ๋ฒ์งธ ๊ฐ์ ํ
์คํธ ์ผ์ด์ค ์ T๋ก, ๋๋จธ์ง๋ ๊ฐ๊ฐ์ ์ผ์ด์ค๋ก ๋ถ๋ฆฌ
const [T, ...cases] = input;
// ์, ํ, ์ข, ์ฐ ๋ฐฉํฅ์ ๋ํ๋ด๋ ๋ฐฐ์ด
const directions = [
[-1, 0], [1, 0], [0, -1], [0, 1] // ์, ์๋, ์ผ์ชฝ, ์ค๋ฅธ์ชฝ
];
// DFS ํจ์: ํ์ฌ ์์น (x, y)์์ ์์ํด ์ฐ๊ฒฐ๋ ๋ชจ๋ ๋ฐฐ์ถ๋ฅผ ๋ฐฉ๋ฌธ
const dfs = (x, y, grid, visited, N, M) => {
// ํ์ฌ ์์น๋ฅผ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
visited[x][y] = true;
// ์, ํ, ์ข, ์ฐ๋ก ์ด๋
for (let [dx, dy] of directions) {
const nx = x + dx; // ์๋ก์ด x์ขํ
const ny = y + dy; // ์๋ก์ด y์ขํ
// ์ ํจํ ์ขํ ๋ด์ ์๊ณ , ๋ฐฐ์ถ๊ฐ ์์ผ๋ฉฐ, ์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด ํ์
if (nx >= 0 && ny >= 0 && nx < N && ny < M && grid[nx][ny] === 1 && !visited[nx][ny]) {
dfs(nx, ny, grid, visited, N, M);
}
}
};
let idx = 0; // ๊ฐ ํ
์คํธ ์ผ์ด์ค์ ์์ ์ธ๋ฑ์ค
let result = []; // ๊ฐ ํ
์คํธ ์ผ์ด์ค์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ๋ฐฐ์ด
// ํ
์คํธ ์ผ์ด์ค ์๋งํผ ๋ฐ๋ณต
for (let t = 0; t < T; t++) {
// ๊ฐ๋ก M, ์ธ๋ก N, ๋ฐฐ์ถ์ ๊ฐ์ K ์ถ์ถ
const [M, N, K] = cases[idx].split(' ').map(Number);
idx++;
// ๋์ฅ์ ํํํ๋ 2์ฐจ์ ๋ฐฐ์ด(grid)์ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด(visited) ์ด๊ธฐํ
const grid = Array.from({ length: N }, () => Array(M).fill(0));
const visited = Array.from({ length: N }, () => Array(M).fill(false));
// ๋ฐฐ์ถ ์ฌ๊ธฐ
for (let i = 0; i < K; i++) {
const [x, y] = cases[idx].split(' ').map(Number);
grid[y][x] = 1; // ๋ฐฐ์ถ๊ฐ ์ฌ์ด์ง ์ขํ๋ฅผ 1๋ก ํ์
idx++;
}
let count = 0; // ๊ตฐ์ง์ ๊ฐ์๋ฅผ ์ธ๊ธฐ ์ํ ๋ณ์
// ๋ชจ๋ ์ขํ๋ฅผ ๋๋ฉด์ ๋ฐฐ์ถ๊ฐ ์ฌ์ด์ ธ ์๊ณ ๋ฐฉ๋ฌธํ์ง ์์ ๊ฒฝ์ฐ DFS ํ์
for (let i = 0; i < N; i++) {
for (let j = 0; j < M; j++) {
if (grid[i][j] === 1 && !visited[i][j]) {
dfs(i, j, grid, visited, N, M);
// ๋ฐฐ์ถ ๊ตฐ์ง ํ์
count++;
// ํ๋์ ๊ตฐ์ง์ ์ฐพ์์ผ๋ฏ๋ก ์นด์ดํธ ์ฆ๊ฐ
}
}
}
// ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ๊ตฐ์ง ์ ์ถ๊ฐ
result.push(count);
}
console.log(result.join('\\n'));
}
solution(input);
๐ก์๊ฐ๋ณต์ก๋
- ๊ทธ๋ํ์ ๊ฐ ๋
ธ๋๋ฅผ ํ ๋ฒ์ฉ ๋ฐฉ๋ฌธํ๊ณ , ๊ฐ ๋
ธ๋์์ ์ํ์ข์ฐ์ 4๋ฐฉํฅ์ ํ์ธํ๊ธฐ ๋๋ฌธ์์๊ฐ ๋ณต์ก๋๋ O(M ร N)์ด๋ค.
- M์ ๊ฐ๋ก ๊ธธ์ด, N์ ์ธ๋ก ๊ธธ์ด
- DFS๋ BFS ์์ฒด๋ O(V + E)์ธ๋ฐ, ์ด ๋ฌธ์ ์์ V(๋
ธ๋์ ์)๋ ๋ฐฐ์ถ ์ขํ ์, E(๊ฐ์ ์ ์)๋ ์ธ์ ํ ๋ฐฐ์ถ์ ์์ ํด๋นํ๋ค.