본문으로 건너뛰기

버그 제보

이상한 점을 알려 주시면 고칠게요. 지금 보고 있는 페이지와 브라우저 정보가 함께 담겨요.

페이지:

Algorithm

그래프의 기본과 표현 방법

작성 2026. 10. 30.추가
목차11개 항목
출처와 참고

용어 정리와 그래프·트리 비교는 팔만코딩경(42Seoul 커뮤니티 위키)의 「[자료구조] 그래프(Graph) 개념 정리」, 「그래프 자료구조」를 바탕으로 보강했다. 딕셔너리 인접 리스트, 탐색 기법의 빈도, 「놓치기 쉬운 것」은 Tech Interview Handbook의 「Graph cheatsheet」를 바탕으로 보강했다. 사이클 없는 그래프와 트리의 차이, 밀집·중복 간선의 표현은 fru1tworld/cs-basic 모의 면접 질문 목록의 「자료구조」 질문이 묻는 개념으로 보강했다.

그래프(Graph)는 정점(vertex, node)과 정점을 잇는 간선(edge)으로 이루어진 자료구조다. 간선에 방향이 있으면 방향(단방향) 그래프, 없으면 무방향(양방향) 그래프다.

방향 그래프와 무방향 그래프

그래프의 종류

  • 완전 그래프(Complete Graph): 모든 정점이 다른 모든 정점과 연결되어 간선 수가 최대인 그래프. 정점이 n개일 때 무방향 그래프는 n(n-1)/2개, 방향 그래프는 두 정점 사이에 방향이 다른 간선 두 개를 둘 수 있으므로 n(n-1)개의 간선을 가진다. 예: 정점 4개인 무방향 완전 그래프의 간선은 6개.
  • 부분 그래프(Subgraph): 원래 그래프에서 일부 정점이나 간선을 빼서 만든 그래프
  • 가중 그래프(Weighted Graph): 간선마다 비용(가중치)이 붙은 그래프. 네트워크라고도 한다. 최단 경로 문제의 대상이다.
  • 연결 그래프(Connected Graph): 무방향 그래프에서 모든 정점 쌍 사이에 경로가 있는 그래프. 경로가 없는 쌍이 있으면 비연결 그래프이고, 서로 이어진 덩어리 각각을 연결 요소(connected component) 라 한다.
  • 이 밖에 사이클이 없는 방향 그래프(DAG), 사이클 없이 모든 정점이 연결된 트리 등이 자주 나온다.

용어

용어뜻
인접(adjacent)간선 하나로 바로 이어진 두 정점의 관계
차수(degree)무방향 그래프에서 한 정점에 붙은 간선 수. 모든 차수의 합 = 간선 수 × 2
진입 차수·진출 차수방향 그래프에서 들어오는(in-degree)·나가는(out-degree) 간선 수. 위상 정렬은 진입 차수 0인 정점부터 꺼낸다
경로(path)·경로 길이간선으로 이어진 정점의 나열과, 그 경로에 쓰인 간선 수
단순 경로(simple path)같은 정점을 두 번 지나지 않는 경로
사이클(cycle)시작과 끝이 같은 단순 경로. 사이클이 없으면 비순환(acyclic) 그래프

그래프와 트리

트리는 그래프의 특수한 경우다. 사이클이 없는 연결 그래프가 트리이고, 정점이 n개면 간선은 정확히 n-1개다.

그래프트리
사이클·자기 루프있을 수 있다없다
두 정점 사이 경로여러 개일 수 있다정확히 하나
루트·부모-자식개념이 없다루트 하나, 루트 외의 노드는 부모가 하나
간선 수정해져 있지 않다n - 1
모델네트워크계층
순회BFS, DFS (방문 체크 필수)전위·중위·후위·레벨 순회

사이클이 없다고 모두 트리는 아니다. 트리는 「사이클 없음」과 「연결됨」을 함께 만족해야 한다.

그래프트리인가이유
사이클 없는 무방향 그래프가 여러 덩어리아니다. 숲(forest) 이다연결되지 않았다. 덩어리 하나하나가 트리이고, 간선 수는 n - (덩어리 수)다
DAG A→B, A→C, B→D, C→D아니다방향 사이클은 없지만 D의 부모가 둘이고, 방향을 지우면 A-B-D-C-A 사이클이 생긴다
사이클 없고 연결된 무방향 그래프트리다정의 그대로

정점이 n개인 무방향 그래프에서 「연결됨」, 「사이클 없음」, 「간선 n-1개」 중 두 가지가 성립하면 나머지 하나도 성립해 트리다. 그래서 간선 목록이 트리인지는 간선 수가 n-1인지 보고, Union-Find로 사이클이 없는지(또는 BFS로 연결됐는지) 하나만 더 확인하면 된다.

트리의 용어와 순회는 트리와 이진 탐색 트리에 정리했다.

그래프 표현: 간선 정보를 어떻게 저장할까

인접 행렬 (Adjacency Matrix): 모든 관계를 저장

V×V 2차원 배열에서 matrix[i][j]에 i → j 간선이 있으면 1(또는 가중치), 없으면 0(또는 무한대)을 둔다.

인접 행렬

INF = float('inf')
matrix = [
    [0, 7, 5],
    [7, 0, INF],
    [5, INF, 0],
]

인접 리스트 (Adjacency List): 연결된 것만 저장

정점마다 연결된 정점(과 가중치)의 목록을 둔다.

인접 리스트

n, m = 3, 2
graph = [[] for _ in range(n)]
edges = [(0, 1, 7), (0, 2, 5)]
for a, b, cost in edges:
    graph[a].append((b, cost))
    graph[b].append((a, cost))  # 무방향이면 양쪽에 추가

비교

인접 행렬인접 리스트
메모리O(V²): 간선이 적어도 V² 칸 필요O(V + E): 실제 간선만 저장
두 정점이 연결됐는지 확인O(1)O(해당 정점의 차수)
한 정점의 이웃 모두 순회O(V)O(차수)
전체 탐색(BFS/DFS)O(V²)O(V + E)
어울리는 경우정점 수가 적고 간선이 빽빽한 그래프, 플로이드-워셜정점이 많고 간선이 드문 그래프(대부분의 문제)

간선이 얼마나 많아야 「빽빽하다」고 보나. 같은 쌍을 잇는 간선이 하나뿐인 단순 그래프는 간선이 최대 V(V-1)/2개(무방향)라, E가 V²에 가까우면 인접 리스트도 O(V²) 공간이 들고 행렬과 차이가 없어진다. 그러면 O(1) 연결 확인과 단순한 구조를 가진 행렬이 낫다. 간선이 V³개처럼 V²보다 많이 주어진다면 같은 쌍을 잇는 중복 간선(multi-edge) 이 있다는 뜻이다. 최단 경로·MST처럼 쌍마다 가장 싼 간선만 의미 있는 문제는 입력을 읽으며 matrix[a][b] = min(matrix[a][b], cost)로 접어 O(V²) 공간에 담는다. 인접 리스트에 V³개를 그대로 담으면 메모리와 순회 비용이 모두 V³이다.

정점이 10만 개라면 인접 행렬은 100억 칸이라 메모리 초과가 난다. 코딩 테스트에서는 인접 리스트가 기본이고, 정점이 수백 개 이하이거나 연결 여부를 자주 물을 때 인접 행렬을 쓴다. 정점이 문자열이거나 번호가 듬성듬성하면 딕셔너리 인접 리스트(defaultdict(set), 가중치가 있으면 딕셔너리의 딕셔너리)가 가장 간단하다. 간선 목록으로 주어지면 먼저 이런 구조로 바꾼 뒤 탐색한다.

그래프 탐색 기법

기법핵심 자료구조용도
BFS큐가중치 없는 그래프의 최단 거리
DFS스택/재귀완전 탐색, 연결 요소, 백트래킹
다익스트라우선순위 큐음이 아닌 가중치 그래프의 최단 거리
Union-Findparent 배열연결 여부, 무방향 사이클 판별
위상 정렬진입 차수 + 큐방향 비순환 그래프의 의존 순서, 방향 사이클 판별

BFS·DFS·위상 정렬은 모두 O(V + E)다. 가중치·음수 간선·전체 쌍 여부에 따라 최단 경로 알고리즘을 고르는 기준은 최단 경로 알고리즘 고르기에 있다. 면접에서는 BFS·DFS가 대부분이고 위상 정렬·다익스트라가 가끔 나온다. 벨만-포드, 플로이드-워셜, 최소 신장 트리는 드물다.

그래프 문제의 두 가지 유형

그래프 문제 유형

  1. 격자(미로) 탐색 유형: 2차원 지도가 주어지고 현재 좌표에서 상하좌우로 이동하며 길을 찾는다. 지도가 곧 그래프이므로 따로 인접 리스트를 만들지 않고, 행렬을 지도 그림 그대로 보면서 방향 배열 (dx, dy)로 이웃을 계산하는 편이 쉽다.
  2. 정점 이동 유형: "a와 b가 연결되어 있다" 같은 간선 정보가 주어진다. 이를 바탕으로 인접 리스트(또는 행렬)를 만든 뒤, 방문 여부를 boolean 배열로 체크하며 탐색한다.

놓치기 쉬운 것

  • 트리처럼 보여도 그래프일 수 있다. 사이클이 있을 수 있으면 방문 집합 없이 재귀하면 무한 루프에 빠진다. 각 정점을 한 번만 방문하는지 확인한다.
  • 연결되지 않은 그래프는 한 정점에서 시작한 탐색으로 다 못 본다. 모든 정점을 돌며 미방문 정점에서 탐색을 새로 시작한다.
  • 격자에서는 이웃 좌표가 범위 안인지와 이미 방문했는지를 매번 함께 본다.
  • 빈 그래프, 정점 1~2개, 자기 루프와 중복 간선도 경계 사례다.

핵심 정리

  • 그래프 = 정점 + 간선, 방향/무방향, 가중치 유무로 구분
  • 인접 행렬은 O(V²) 메모리·O(1) 연결 확인, 인접 리스트는 O(V + E) 메모리·빠른 이웃 순회
  • 문제를 보면 먼저 격자형인지, 간선 목록형인지 판단한다.

관련 노트: BFS, DFS, 다익스트라, 최소 신장 트리, 서로소 집합, 단절점과 단절선, 오일러 회로, 트리와 이진 탐색 트리, 위상 정렬, 최단 경로 알고리즘 고르기

원본 기록4

댓글

GitHub 계정으로 댓글을 남길 수 있어요.