January 24, 2023
https://www.acmicpc.net/problem/2606
그 다음 1번 컴퓨터에 대해서 바이러스를 침투하는 다음 로직을 수행한다.
- 현재 컴퓨터가 이전에 방문한 적이 있던 컴퓨터라면 스킵한다.
 - 현재 침투중인 컴퓨터가 1번 컴퓨터가 아니라면 카운트 변수를 증가시킨다.
 - 현재 컴퓨터에 대해서 바이러스를 침투하고 방문 여부를 기록한다.
 - 현재 컴퓨터와 연결된 모든 컴퓨터에 대해서, 재귀적인 방법으로 바이러스를 침투한다.
 
// 입력 정제
const fs = require("fs");
function getInput(caseID) {
  const filePath = process.platform === "linux" ? "/dev/stdin" : `./${__dirname.split('\\').pop()}/i${caseID}.txt`;
  const input = fs.readFileSync(filePath).toString().split("\n").map(item => item.trim());
  input.pop();
  const n = Number(input.shift()); // 컴퓨터의 수
  const m = Number(input.shift()); // 연결의 수
  const map = Array.from({ length: n + 1 }, () => Array.from({ length: n + 1 }, () => 0));
  for (let i = 0; i < m; i++) {
    const [a, b] = input.shift().split(" ").map(item => Number(item));
    map[a][b] = 1;
    map[b][a] = 1;
  }
  
  return [n, m, map];
}
// 문제
const [n, m, map] = getInput(1);
const visited = Array.from({ length: n + 1}, () => 0);
let count = 0;
// 해당 번호의 컴퓨터와, 연결된 모든 컴퓨터에 바이러스 침투
function penetrate(num) {
  if (visited[num]) return;
  if (num !== 1) count++; // 현재 침투중인 컴퓨터가 바이러스 숙주인 1번이 아니라면, 카운트 증가하기
  visited[num] = 1;
  
  for (let i = 1; i <= n; i++) {
    if (map[num][i]) penetrate(i);
  }
}
function solution() {
  penetrate(1);
  console.log(count);
}
// 실행
solution();