๋ฌธ์
์ฐจ์ธ๋ ์๋์ธ ํ๋๋ ๊ฐ์๋ ๊ณ ๋ญ์ง์์ ์ ๊ธฐ๋ ๋ฐฐ์ถ๋ฅผ ์ฌ๋ฐฐํ๊ธฐ๋ก ํ์๋ค. ๋์ฝ์ ์ฐ์ง ์๊ณ ๋ฐฐ์ถ๋ฅผ ์ฌ๋ฐฐํ๋ ค๋ฉด ๋ฐฐ์ถ๋ฅผ ํด์ถฉ์ผ๋ก๋ถํฐ ๋ณดํธํ๋ ๊ฒ์ด ์ค์ํ๊ธฐ ๋๋ฌธ์, ํ๋๋ ํด์ถฉ ๋ฐฉ์ง์ ํจ๊ณผ์ ์ธ ๋ฐฐ์ถํฐ์ง๋ ์ด๋ฅผ ๊ตฌ์ ํ๊ธฐ๋ก ๊ฒฐ์ฌํ๋ค. ์ด ์ง๋ ์ด๋ ๋ฐฐ์ถ๊ทผ์ฒ์ ์์ํ๋ฉฐ ํด์ถฉ์ ์ก์ ๋จน์์ผ๋ก์จ ๋ฐฐ์ถ๋ฅผ ๋ณดํธํ๋ค. ํนํ, ์ด๋ค ๋ฐฐ์ถ์ ๋ฐฐ์ถํฐ์ง๋ ์ด๊ฐ ํ ๋ง๋ฆฌ๋ผ๋ ์ด๊ณ ์์ผ๋ฉด ์ด ์ง๋ ์ด๋ ์ธ์ ํ ๋ค๋ฅธ ๋ฐฐ์ถ๋ก ์ด๋ํ ์ ์์ด, ๊ทธ ๋ฐฐ์ถ๋ค ์ญ์ ํด์ถฉ์ผ๋ก๋ถํฐ ๋ณดํธ๋ฐ์ ์ ์๋ค. ํ ๋ฐฐ์ถ์ ์ํ์ข์ฐ ๋ค ๋ฐฉํฅ์ ๋ค๋ฅธ ๋ฐฐ์ถ๊ฐ ์์นํ ๊ฒฝ์ฐ์ ์๋ก ์ธ์ ํด์๋ ๊ฒ์ด๋ค.
ํ๋๊ฐ ๋ฐฐ์ถ๋ฅผ ์ฌ๋ฐฐํ๋ ๋ ์ ๊ณ ๋ฅด์ง ๋ชปํด์ ๋ฐฐ์ถ๋ฅผ ๊ตฐ๋ฐ๊ตฐ๋ฐ ์ฌ์ด ๋์๋ค. ๋ฐฐ์ถ๋ค์ด ๋ชจ์ฌ์๋ ๊ณณ์๋ ๋ฐฐ์ถํฐ์ง๋ ์ด๊ฐ ํ ๋ง๋ฆฌ๋ง ์์ผ๋ฉด ๋๋ฏ๋ก ์๋ก ์ธ์ ํด์๋ ๋ฐฐ์ถ๋ค์ด ๋ช ๊ตฐ๋ฐ์ ํผ์ ธ์๋์ง ์กฐ์ฌํ๋ฉด ์ด ๋ช ๋ง๋ฆฌ์ ์ง๋ ์ด๊ฐ ํ์ํ์ง ์ ์ ์๋ค. ์๋ฅผ ๋ค์ด ๋ฐฐ์ถ๋ฐญ์ด ์๋์ ๊ฐ์ด ๊ตฌ์ฑ๋์ด ์์ผ๋ฉด ์ต์ 5๋ง๋ฆฌ์ ๋ฐฐ์ถํฐ์ง๋ ์ด๊ฐ ํ์ํ๋ค. 0์ ๋ฐฐ์ถ๊ฐ ์ฌ์ด์ ธ ์์ง ์์ ๋ ์ด๊ณ , 1์ ๋ฐฐ์ถ๊ฐ ์ฌ์ด์ ธ ์๋ ๋ ์ ๋ํ๋ธ๋ค.
์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ ์ค์๋ ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ ์ค๋ถํฐ ๊ฐ๊ฐ์ ํ ์คํธ ์ผ์ด์ค์ ๋ํด ์ฒซ์งธ ์ค์๋ ๋ฐฐ์ถ๋ฅผ ์ฌ์ ๋ฐฐ์ถ๋ฐญ์ ๊ฐ๋ก๊ธธ์ด M(1 ≤ M ≤ 50)๊ณผ ์ธ๋ก๊ธธ์ด N(1 ≤ N ≤ 50), ๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ถ๊ฐ ์ฌ์ด์ ธ ์๋ ์์น์ ๊ฐ์ K(1 ≤ K ≤ 2500)์ด ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ K์ค์๋ ๋ฐฐ์ถ์ ์์น X(0 ≤ X ≤ M-1), Y(0 ≤ Y ≤ N-1)๊ฐ ์ฃผ์ด์ง๋ค. ๋ ๋ฐฐ์ถ์ ์์น๊ฐ ๊ฐ์ ๊ฒฝ์ฐ๋ ์๋ค.
์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค์ ๋ํด ํ์ํ ์ต์์ ๋ฐฐ์ถํฐ์ง๋ ์ด ๋ง๋ฆฌ ์๋ฅผ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ 1
2
10 8 17
0 0
1 0
1 1
4 2
4 3
4 5
2 4
3 4
7 4
8 4
9 4
7 5
8 5
9 5
7 6
8 6
9 6
10 10 1
5 5
์์ ์ถ๋ ฅ 1
5
1
๐ ํ์ด ์ฝ๋
const fs = require('fs');
const file = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
const input = fs.readFileSync(file).toString().trim().split('\n');
const dx = [-1, 1, 0, 0];
const dy = [0, 0, -1, 1];
function dfs(graph, n, m, x, y) {
// ์ฃผ์ด์ง ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ์๋ ์ฆ์ ์ข
๋ฃ
if (x < 0 || x >= n || y < 0 || y >= m) {
return false;
}
// ํ์ฌ ๋
ธ๋๋ฅผ ์ฒ๋ฆฌํ๋ค๋ฉด
if (graph[x][y] !== 1) {
return false;
}
// ํด๋น ๋
ธ๋ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
graph[x][y] = -1;
// ์, ํ, ์ข, ์ฐ์ ์์น๋ค๋ ๋ชจ๋ ์ฌ๊ท์ ์ผ๋ก ํธ์ถ
// ์ด ์ฌ๊ทํจ์๋ค์ ๋ฐฉ๋ฌธ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ฌ๊ท์ด๋ค.
for (let i = 0; i < 4; i++) {
const nx = x + dx[i];
const ny = y + dy[i];
dfs(graph, n, m, nx, ny);
}
return true;
}
let testCases = Number(input[0]);
let line = 1;
let answer = '';
while (testCases--) {
// ๊ฐ๋ก ๊ธธ์ด(M), ์ธ๋ก ๊ธธ์ด(N), ๋ฐฐ์ถ๊ฐ ์ฌ์ด์ ธ ์๋ ์์น์ ๊ฐ์(K)
const [m, n, k] = input[line].split(' ').map(Number);
const graph = Array.from({ length: n }, () => new Array(m)); // ๊ทธ๋ํ ์ ๋ณด
for (let i = 1; i <= k; i++) {
const [y, x] = input[line + i].split(' ').map(Number);
graph[x][y] = 1;
}
let count = 0; // ์ฐ๊ฒฐ ์์์ ์ ๊ณ์ฐ
for (let i = 0; i < n; i++) {
for (let j = 0; j < m; j++) {
if (dfs(graph, n, m, i, j)) {
count++;
}
}
}
line += k + 1;
answer += count + '\n';
}
console.log(answer);
๐ ํ์ด ํด์ค
DFS๋ก ํ์ด๋ฅผํ๋ค.
์ด ๋ฌธ์ ๋ ๊ฒฐ๊ตญ ์ฐ๊ฒฐ์์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ค.
[์, ํ, ์ข, ์ฐ]์ ์์น๋ก ๊ฐ์ ์ด ์ฐ๊ฒฐ ๋์ด์๋ ๊ทธ๋ํ๋ก ์ดํดํ ์ ์๋ค.
ํ ์คํธ์ผ์ด์ค ์ ์ถ๋ ฅ์ ๋ฐ์ ํ,
์ ์ถ๋ ฅ์ ๋ํด์ ๊ทธ๋ํ๋ฅผ ์ด๊ธฐํ ์์ผ์ฃผ๊ณ ๋ฐฐ์ถ๊ฐ ์๋ ์์น๋ฅผ ๋ฃ์ด์ค๋ค.
๊ทธ๋ํ์ ์ผ์ชฝ ์๋จ๋ถํฐ ์์ํด์ ์์ง ์ฒ๋ฆฌ๋์ง ์๋ ๋ ธ๋์ ๋ํด DFS์ฒ๋ฆฌ๋ฅผ ์ํํ๋ค.
DFSํจ์ ๋ด์์๋
- ๋ฒ์๊ฐ ๋ฒ์ด๋๋ฉด return false
- ๊ทธ๋ํ์ ํด๋น ์ธ๋ฑ์ค ๊ฐ์ด 1์ด ์๋๋ผ๋ฉด. ์ฆ, ๋ฐฉ๋ฌธํ๋ ค๋ ๋ ธ๋๋ฅผ ์ฒ๋ฆฌํ ํ์๊ฐ ์์ผ๋ฉด return false
์ด ๋๊ฐ์ง์ ์กฐ๊ฑด์ ํต๊ณผํ๋ฉด
๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ์์ํ๋ค.
๋จผ์ ํ์ฌ ๋ฐฉ๋ฌธํ ๋ ธ๋์ ๋ํด์ ๋ฐฉ๋ฌธ์ ์ฒ๋ฆฌํ๊ณ ๋ค์ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํด์ ํ์ฌ ์์น์์ ์, ํ, ์ข, ์ฐ์ ๋ํ ์์น๋ฅผ ๋ฐฉ๋ฌธ์ฒ๋ฆฌํ๋ค.
DFSํจ์ ๋ด์์ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํ๋ ๋ถ๋ถ์ ์ฒ์ ๋ค์ด์จ ์์น๋ถํฐ ์์ํด์ ์, ํ, ์ข, ์ฐ์ ๋ํ ์์น๋ฅผ ๋ฐฉ๋ฌธํด์ ์ฒ๋ฆฌ๋ง ํ๋ค๊ณ ์๊ฐํ๋ฉด ์ฝ๋ค.