Arian Soleimanzadeh
  • 홈
  • 블로그
  • 팟캐스트
  • 비디오
  • 라이브러리
  • 문의
العربيةArabic
DeutschGerman
EnglishEnglish
فارسیPersian
한국어Korean
中文Chinese
패널•빠른 문의

Languages

Choose your interface locale

ar

العربية

Arabic

de

Deutsch

German

en

English

English

fa

فارسی

Persian

ko

한국어

Korean

zh

中文

Chinese

상담 예약

짧은 메시지를 남겨주세요 — 가능한 한 빠르게 답변드리겠습니다.

LinkedIn빠른 응답
홈/아티클/Strongly Connected Components(SCC) — 기초부터 실무까지 완전 정리
AlgorithmsGraph Algorithms아티클

Strongly Connected Components(SCC) — 기초부터 실무까지 완전 정리

방향 그래프의 SCC를 mutual reachability, Kosaraju, Condensation Graph, 복잡도, Edge Case와 실제 소프트웨어 활용 사례까지 설명합니다.

2026년 8월 21일9 분 읽기8 조회수
#Graph#Algorithms#JavaScript#TypeScript#SCC#Kosaraju#Strongly Connected Components

Arian Soleimanzadeh

Software Engineer & Researcher

방향 그래프의 Strongly Connected Components와 SCC 분해 시각 가이드

Arian Soleimanzadeh

AI · 코드 · 제품

연구 + 엔지니어링
이 페이지에서
Reachability와 Strong Connectivity의 차이SCC는 어디에 쓰이나요?Kosaraju와 Tarjan왜 동작하나요?실무 예시: 순환 의존성Condensation Graph

Strongly Connected Components(SCC) 는 방향 그래프에서 매우 중요한 구조입니다. 하나의 SCC 안에 있는 모든 정점은 다른 모든 정점으로 도달할 수 있고, 반대 방향으로도 다시 돌아올 수 있습니다.

두 정점 u, v가 같은 SCC에 있다면 다음이 모두 성립해야 합니다.

Code
12
u ~> v
v ~> u

Reachability와 Strong Connectivity의 차이

다음 그래프를 보겠습니다.

Code
1
A -> B -> C

A에서 C로 갈 수 있지만 C에서 A로 돌아갈 수 있다는 보장은 없습니다. 따라서 두 정점이 같은 SCC라고 할 수 없습니다.

반면:

Code
123
A -> B -> C
^         |
|_________|

에서는 모든 정점이 서로 도달 가능하므로 {A, B, C}가 하나의 SCC입니다.

SCC는 어디에 쓰이나요?

  • 소프트웨어 모듈의 Circular Dependency 탐지
  • Microservice 의존성 분석
  • Call Graph와 Control-Flow Graph 분석
  • 방향성을 가진 소셜 네트워크 분석
  • State Machine의 반복 가능한 상태 그룹 탐지
  • Build System 및 Package Manager의 dependency 분석
  • 큰 방향 그래프를 더 작은 DAG로 압축

Kosaraju와 Tarjan

대표적인 SCC 알고리즘은 다음 두 가지입니다.

  1. Kosaraju
  2. Tarjan

둘 다 시간 복잡도는:

Code
1
O(V + E)

입니다.

Kosaraju는 두 번의 DFS와 역방향 그래프를 사용하므로 개념적으로 이해하기 쉽습니다.

Kosaraju 알고리즘의 동작

  1. 원본 그래프에서 DFS를 수행하고 정점의 종료 순서를 저장합니다.
  2. 모든 간선의 방향을 반대로 뒤집습니다.
  3. 종료 시간이 큰 정점부터 역방향 그래프에서 DFS를 수행합니다.

세 번째 단계에서 시작되는 각각의 DFS가 하나의 SCC를 만듭니다.

왜 동작하나요?

각 SCC를 하나의 super-node로 압축하면 Condensation Graph가 만들어집니다. 이 그래프는 항상 DAG입니다.

만약 압축된 그래프에 cycle이 있다면, 그 cycle에 포함된 SCC들은 서로 도달할 수 있다는 뜻이므로 원래부터 하나의 더 큰 SCC여야 합니다.

첫 번째 DFS의 finishing order와 간선 반전은 두 번째 DFS가 각 SCC를 분리해서 방문할 수 있게 합니다.

JavaScript 구현

JavaScript
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
function kosaraju(graph) {
  const visited = new Set();
  const order = [];
  const nodes = new Set(Object.keys(graph));

  for (const neighbors of Object.values(graph)) {
    for (const node of neighbors) nodes.add(node);
  }

  function dfs1(node) {
    visited.add(node);

    for (const next of graph[node] ?? []) {
      if (!visited.has(next)) dfs1(next);
    }

    order.push(node);
  }

  for (const node of nodes) {
    if (!visited.has(node)) dfs1(node);
  }

  const reversed = {};

  for (const node of nodes) reversed[node] = [];

  for (const [from, neighbors] of Object.entries(graph)) {
    for (const to of neighbors) reversed[to].push(from);
  }

  visited.clear();
  const components = [];

  function dfs2(node, component) {
    visited.add(node);
    component.push(node);

    for (const next of reversed[node] ?? []) {
      if (!visited.has(next)) dfs2(next, component);
    }
  }

  while (order.length) {
    const node = order.pop();

    if (!visited.has(node)) {
      const component = [];
      dfs2(node, component);
      components.push(component);
    }
  }

  return components;
}

실무 예시: 순환 의존성

Code
123
Auth -> User
User -> Payment
Payment -> Auth

이 세 모듈은 순환 의존성을 형성하며 SCC 분석을 통해 하나의 강하게 연결된 그룹으로 탐지할 수 있습니다.

Condensation Graph

예를 들어:

Code
123
S1 = {A, B, C}
S2 = {D, E}
S3 = {F}

를 각각 하나의 노드로 압축하면:

Code
1
S1 -> S2 -> S3

와 같은 DAG를 만들 수 있습니다. 이는 scheduling, dependency analysis, 후속 그래프 처리에 유용합니다.

복잡도

Code
12
Time:  O(V + E)
Space: O(V + E)

모든 정점과 간선을 상수 횟수만큼 처리하기 때문입니다.

중요한 Edge Case

  • 고립된 정점 하나도 SCC입니다.
  • Self-loop가 있는 정점도 단일 SCC가 될 수 있습니다.
  • 전체 그래프가 strongly connected라면 SCC는 하나뿐입니다.
  • DAG에서는 모든 정점이 각각 하나의 SCC입니다.

SCC와 Cycle Detection의 차이

정점이 둘 이상인 SCC에는 반드시 cycle이 존재합니다. 하지만 SCC는 단순히 cycle 하나를 찾는 것이 아니라 전체 그래프를 최대 mutual-reachability 영역으로 분할합니다.

언제 사용해야 하나요?

다음과 같은 질문에 적합합니다.

  • 어떤 정점들이 서로 양방향으로 도달 가능한가?
  • 어떤 dependency들이 순환 구조를 만드는가?
  • 어떤 서비스나 모듈이 강하게 결합되어 있는가?
  • 방향 그래프를 어떻게 DAG로 압축할 수 있는가?
  • 어떤 상태들이 반복 가능한 영역을 형성하는가?

정리

Kosaraju는 다음 흐름으로 기억할 수 있습니다.

Code
1234567
DFS + finishing order
        ↓
Reverse graph
        ↓
DFS in reverse finishing order
        ↓
SCCs

핵심은 코드를 외우는 것이 아니라 mutual reachability, finishing time, condensation graph가 서로 어떻게 연결되는지 이해하는 것입니다.

이 페이지에서
Reachability와 Strong Connectivity의 차이SCC는 어디에 쓰이나요?Kosaraju와 Tarjan왜 동작하나요?실무 예시: 순환 의존성Condensation Graph

아티클 정보

게시 정보, 읽기 시간 및 조회 데이터입니다.

게시일

2026년 8월 21일

업데이트

2026년 10월 27일

읽기 시간

9 분 읽기

조회수

8

작성자

Arian Soleimanzadeh

이전 아티클

Travelling Salesman Problem(TSP): Brute Force부터 Dynamic Programming까지

다음 아티클

JavaScript와 TypeScript로 Kosaraju 알고리즘 구현하기

Arian Soleimanzadeh

현대적인 웹 엔지니어링, UI 시스템, 실용적인 AI 제품에 집중한 개인 포트폴리오 — 깨끗한 코드, 명확한 디자인.

빠른 링크

  • 소개
  • 블로그
  • 라이브러리
  • 문의

문의

  • soleimanzadeh.a.work@gmail.com
  • soleimanzadeh.uni@gmail.com

가능 시간: 평일

보통 다음 시간 내에 답변합니다 24시간.

뉴스레터

글, 프로젝트, 새 릴리스에 대한 업데이트를 받아보세요.

© 2026 ariansoleimanzadeh.dev — 모든 권리 보유.

LinkedIn