[백준] 11724번 연결요소개수

2020년 08월 17일, 12:00

연결 요소 개수

문제 설명

방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.

문제 풀이

  1. 해당 정점으로 부터 연결된 정점을 다 살펴봐야한다. -> 2차원 배열을 이용해서 표시.(connected배열)
  2. 방문된 정점이면 continue;
  3. 그렇지 않다면, 해당 정점으로부터 연결되어 갈 수 있는 정점을 모두 탐색. queue가 비어지는 경우 count++(그룹의 수).
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
// const input = fs.readFileSync("./stdin").toString().trim().split("\n");
const [vertexLen, edgeLen] = input[0].split(" ").map(e => +e);
const edges = input.slice(1).map(e => e.split(" ").map(el => +el));

const connected = Array(vertexLen + 1)
  .fill(0)
  .map(e => Array());

edges.forEach(e => {
  connected[e[0]].push(e[1]);
  connected[e[1]].push(e[0]);
});

const visited = Array(vertexLen + 1).fill(false);

let count = 0;
for (let i = 1; i < vertexLen + 1; i++) {
  if (visited[i] === true) continue;
  const queue = [i];
  while (queue.length) {
    const start = queue.pop();
    if (visited[start] === true) continue;
    visited[start] = true;
    queue.push(...connected[start]);
  }
  count++;
}

console.log(count);