๐ก๋ฌธ์ ๋ถ์ ์์ฝ
- ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์์ ์ฐ๊ฒฐ ์์์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์
- ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๊ทธ๋ํ์ ๋
ธ๋์ ๊ฐ์ ์ ๋ณด๋ฅผ ํตํด, ์ฐ๊ฒฐ๋ ๋ถ๋ถ ๊ทธ๋ํ๊ฐ ๋ช ๊ฐ ์๋์ง ๊ณ์ฐํ๋ ๊ฒ์ด ๋ชฉํ์ด๋ค.
- ์ฐ๊ฒฐ ์์๋ ๊ทธ๋ํ์์ ์๋ก ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค์ ์งํฉ์ ๋งํ๋ค.
- ๋
ธ๋๊ฐ 1๋ถํฐ
n
๊น์ง ์์ผ๋ฉฐ, ๋ ๋
ธ๋๊ฐ ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉด ๊ฐ์ ์ฐ๊ฒฐ ์์์ ์ํ๊ฒ ๋๋ค.
๐ก์๊ณ ๋ฆฌ์ฆ ์ค๊ณ
- ๊ทธ๋ํ ํํ
- ์ฃผ์ด์ง ๊ทธ๋ํ๋ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ์ฌ ํํํ๋ค.
- ๊ฐ ๋
ธ๋์ ๋ํด ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค์ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด ๊ฐ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
- DFS(๊น์ด ์ฐ์ ํ์)
- ๊ทธ๋ํ ํ์์๋ DFS๋ฅผ ์ฌ์ฉํ๋ค.
- DFS๋ ํ ๋
ธ๋์์ ์์ํด ํด๋น ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ๋
ธ๋๋ฅผ ํ์ํ๋ฉฐ, ๊ฐ์ ์ฐ๊ฒฐ ์์์ ์ํ ๋
ธ๋๋ค์ ๋ฐฉ๋ฌธํ๊ฒ ๋๋ค.
- ๋ฐฉ๋ฌธ ์ฌ๋ถ ์ฒดํฌ
- ๊ฐ ๋
ธ๋๊ฐ ์ด๋ฏธ ๋ฐฉ๋ฌธ๋์๋์ง ํ์ธํ๊ธฐ ์ํด
visited
๋ฐฐ์ด์ ์ฌ์ฉํ๋ค.
- ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ฅผ ๋ฐ๊ฒฌํ๋ฉด, ์๋ก์ด ์ฐ๊ฒฐ ์์๋ก ๊ฐ์ฃผํ๊ณ DFS๋ฅผ ํตํด ํด๋น ์ฐ๊ฒฐ ์์์ ๋ชจ๋ ๋
ธ๋๋ฅผ ํ์ํ๋ค.
- ์ฐ๊ฒฐ ์์ ๊ฐ์ ๊ณ์ฐ
- ๊ฐ ๋
ธ๋์ ๋ํด DFS๋ฅผ ์ํํ๋ฉฐ, ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๊ฐ ์์ ๋๋ง๋ค ์ฐ๊ฒฐ ์์์ ๊ฐ์๋ฅผ 1์ฉ ์ฆ๊ฐ์ํจ๋ค.
๐ก์ฝ๋
const fs = require('fs');
const path = require('path');
const input = fs.readFileSync(path.join(__dirname, 'input.txt')).toString().trim().split('\\n')
const [n, m] = input[0].split(' ').map(Number);
// n: ๋
ธ๋ ์, m: ๊ฐ์ ์
const graph = Array.from({ length: n + 1 }, () => []);
// ๋
ธ๋๋ผ๋ฆฌ ์ฐ๊ฒฐ๋ ์ ๋ณด๋ฅผ ์ ์ฅํ ์ธ์ ๋ฆฌ์คํธ
// - ๋
ธ๋ ๋ฒํธ๊ฐ 1๋ถํฐ ์์ํ๊ธฐ ๋๋ฌธ์ length: n + 1
// ๊ทธ๋ํ ๊ตฌ์ถ
for (let i = 1; i <= m; i++) {
const [u, v] = input[i].split(' ').map(Number);
// ๋ ๋ฒ์งธ ์ค๋ถํฐ ๊ฐ์ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
graph[u].push(v);
// u์ ๋ฐฐ์ด์ v๋ฅผ ์ถ๊ฐ(= ๋
ธ๋ u์ ๋
ธ๋ v๊ฐ ์ฐ๊ฒฐ๋จ)
graph[v].push(u);
// ๋ฐ๋๋ก v์ ๋ฐฐ์ด์ u๋ฅผ ์ถ๊ฐ
}
// ๋
ธ๋๊ฐ ๋ฐฉ๋ฌธํ๋์ง ์ฌ๋ถ๋ฅผ ๊ธฐ๋ก
const visited = Array(n + 1).fill(false);
// DFS ํจ์
const dfs = (node) => {
// ํ์ฌ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋์ง ๊ธฐ๋ก
visited[node] = true;
// ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค(neighbor)์ ์ฐจ๋ก๋๋ก ํ์
for (let neighbor of graph[node]) {
// ๋ฐฉ๋ฌธํ์ง ์์ neighbor๊ฐ ์๋ค๋ฉด
if (!visited[neighbor]) {
// ๊ทธ ๋
ธ๋์ ๋ํด ๋ค์ dfs(neighbor)๋ฅผ ํธ์ถํ์ฌ ๊ณ์ํด์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค์ ํ์
dfs(neighbor);
}
}
};
// ์ฐ๊ฒฐ ์์์ ๊ฐ์๋ฅผ ์ ์ฅํ๋ ๋ณ์
let connectedComponents = 0;
// ๋ชจ๋ ๋
ธ๋์ ๋ํด DFS ์ํ
for (let i = 1; i <= n; i++) {
// ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ผ๋ฉด
if (!visited[i]) {
connectedComponents++;
// ์ฐ๊ฒฐ ์์ 1 ์ฆ๊ฐ
dfs(i);
// ๊ทธ ๋
ธ๋๋ฅผ ์์์ ์ผ๋ก DFS ์ํ
}
}
// ์ฐ๊ฒฐ ์์์ ๊ฐ์ ์ถ๋ ฅ
console.log(connectedComponents);
๐ก์๊ฐ๋ณต์ก๋
- ์๊ฐ ๋ณต์ก๋๋ O(n + m)์ด๋ค.
n
์ ๋
ธ๋์ ์, m
์ ๊ฐ์ ์ ์