๐Ÿ’ก๋ฌธ์ œ ๋ถ„์„ ์š”์•ฝ

๐Ÿ’ก์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๊ณ„

๐Ÿ’ก์ฝ”๋“œ

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);

๐Ÿ’ก์‹œ๊ฐ„๋ณต์žก๋„