February 11, 2023
https://www.acmicpc.net/problem/11724
모든 노드를 대상으로 아래 로직을 수행한다.
- 이미 현재 노드를 방문했다면 다음으로 넘어간다.
 - 아직 해당 노드를 방문하지 않았다면 해당 노드와 연결된 모든 노드를 방문한다.
 - 연결된 모든 노드의 방문을 끝냈으면 카운트를 기록한다.
 
기존에 입력 데이터 파일을 불러와서 정제하는 과정에서 Array.prototype.shift()를 사용했었는데 이 때문에 시간초과가 계속 발생했었다. 사실 굳이 shift로 꺼내지 않아도 충분히 정제가 가능했었다.
// 입력 정제
const INPUT_NAME = "i1.txt";
const filePath = process.platform === "linux" ? "/dev/stdin" : `./${__dirname.split('\\').pop()}/${INPUT_NAME}`;
const input = require("fs").readFileSync(filePath).toString().trim().split("\n").map(item => item.trim());
const [n, m] = input[0].split(" ").map(item => Number(item));
const map = Array.from({ length: n + 1 }, () => []);
for (let i = 1; i <= m; i++) {
  const [u, v] = input[i].split(" ").map(item => Number(item));
  map[u].push(v);
  map[v].push(u);
}
// 문제
const visited = Array.from({ length: n + 1 }, () => 0);
let count = 0;
function dfs(id) {
  if (visited[id]) return;
  visited[id] = 1;
  // 현재 탐색중인 노드와 연결된 모든 노드를 탐색
  for (let i = 0; i < map[id].length; i++) {
    const next = map[id][i];
    if (visited[next]) continue;
    dfs(map[id][i]);
  }
}
function solution() {
  // 전체 노드를 탐색하되, 이미 방문한 노드이면 스킵
  for (let i = 1; i <= n; i++) {
    if (visited[i]) continue;
    dfs(i);
    count++;
  }
  console.log(count);
}
// 실행
solution();