Foundry
자료구조
기초
핵심

그래프 기초

정점과 간선으로 구성, 방향/무방향, 가중치

그래프 기초

노드(정점)와 간선(엣지)으로 관계를 표현하는 자료구조. SNS 친구, 도로망, 웹 링크 등 현실 모델링에 필수.

기본 용어

    A --- B
    |   / |
    |  /  |
    C --- D

노드(정점): A, B, C, D
간선(엣지): A-B, A-C, B-C, B-D, C-D
차수(degree): A=2, B=3, C=3, D=2

그래프 종류

종류설명예시
무방향A ↔ BSNS 친구
방향A → B팔로우
가중치간선에 비용도로 거리
사이클순환 경로 존재순환 참조
DAG방향 + 비순환빌드 의존성

구현 방법

[인접 행렬]
    A  B  C  D
A [ 0, 1, 1, 0 ]
B [ 1, 0, 1, 1 ]
C [ 1, 1, 0, 1 ]
D [ 0, 1, 1, 0 ]

[인접 리스트]
A → [B, C]
B → [A, C, D]
C → [A, B, D]
D → [B, C]
구분인접 행렬인접 리스트
공간O(V²)O(V+E)
간선 확인O(1)O(degree)
모든 이웃O(V)O(degree)
희소 그래프낭비효율적
밀집 그래프효율적오버헤드

BFS vs DFS

BFS (너비 우선): 가까운 것 먼저
    1 → 2, 3 → 4, 5

DFS (깊이 우선): 끝까지 파고듬
    1 → 2 → 4 → (돌아옴) → 5 → 3

실무 활용

문제알고리즘
최단 경로BFS, 다익스트라
사이클 감지DFS
위상 정렬DFS, 카운트
MST크루스칼, 프림
SNS 추천BFS (2-hop 친구)
면접에서 이렇게 나옵니다

Q.인접 행렬과 인접 리스트의 차이를 설명해주세요.

없는 관계까지 자리를 잡는지가 다릅니다.

항목인접 행렬인접 리스트
메모리정점 수의 제곱정점 수 더하기 간선 수
두 정점의 연결 확인O(1)O(차수)
한 정점의 이웃 순회O(정점 수)O(차수)
간선 추가와 삭제O(1)O(차수)

정점 3억, 관계 600억인 소셜 그래프를 행렬로 담으면 9 곱하기 10의 16승 칸이 필요해 물리적으로 불가능합니다. 리스트로 담으면 600억 개만 저장합니다.

반대로 정점 1,000에 관계 40만(밀도 40%)이면 행렬이 125KB로 리스트(3.2MB)보다 작고 확인도 빠릅니다.

흔한 실수: 항상 리스트가 낫다고 답하는 것. 밀도가 기준입니다. 그리고 "연결됐나"를 자주 묻는 알고리즘이면 행렬의 O(1)이 큰 이점입니다.

Q.그래프에서 사이클을 어떻게 감지하나요?

방향이 있는지에 따라 방법이 다릅니다.

그래프방법
무방향DFS 중 이미 방문한 정점을 만나면 사이클. 단 바로 온 부모는 제외한다
무방향합집합 찾기로 간선을 합칠 때 이미 같은 집합이면 사이클
방향DFS 중 현재 경로에 있는 정점을 만나면 사이클
방향위상 정렬을 시도해 모든 정점을 정렬하지 못하면 사이클

방향 그래프에서 "방문했다"만 보면 안 됩니다. 갈래가 나뉘어 이미 끝난 정점을 다시 만나는 것은 사이클이 아닙니다. 그래서 방문 상태를 셋으로 둡니다.

안 봤다 / 지금 경로에 있다 / 다 보고 나왔다

흔한 실수: 무방향 그래프에서 부모를 제외하지 않는 것. 그러면 모든 간선이 사이클로 잡힙니다.

Q.DAG란 무엇이고 어디에 활용되나요?

방향이 있고 사이클이 없는 그래프입니다. 사이클이 없으므로 순서를 정할 수 있습니다.

활용무엇이 정점이고 간선인가
빌드 의존성모듈이 정점, "먼저 빌드해야 한다"가 간선
작업 스케줄링작업이 정점, 선행 관계가 간선
데이터 파이프라인처리 단계가 정점, 데이터 흐름이 간선
패키지 설치 순서패키지가 정점, 의존이 간선
블록체인, 버전 관리 이력커밋이 정점, 부모 관계가 간선

이 순서를 구하는 것이 위상 정렬입니다. 들어오는 간선이 없는 정점부터 꺼내며 진행하고, 끝까지 꺼내지 못하면 사이클이 있다는 뜻입니다.

흔한 실수: DAG를 트리와 같은 것으로 보는 것. 트리는 부모가 하나지만 DAG는 여러 정점이 같은 정점을 가리킬 수 있습니다. 모듈 A와 B가 모두 C를 의존하는 경우입니다.

Q.희소 그래프와 밀집 그래프에서 적합한 구현 방식은?

간선 수가 정점 수의 제곱에 가까운지로 갈립니다.

구분간선 수적합한 표현
희소정점 수에 비례하는 수준인접 리스트
밀집정점 수의 제곱에 가깝다인접 행렬

판단은 밀도로 합니다. 간선 수를 가능한 최대 간선 수로 나눈 값입니다.

규모밀도판정
소셜 그래프정점 3억, 관계 600억0.0000007%희소
작은 완전 그래프정점 1,000, 관계 40만40%밀집

실무 그래프는 대부분 희소합니다. 사람이 팔로우하는 수, 도시를 잇는 도로 수, 웹페이지의 링크 수는 전체 규모와 무관하게 일정 범위에 머무릅니다.

흔한 실수: 정점이 많으면 밀집이라고 답하는 것. 절대 수가 아니라 가능한 간선 대비 비율입니다. 정점이 3억이어도 각자 200명만 팔로우하면 극단적으로 희소합니다.

먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.

더 깊이 공부하기

읽었으면 문제로 확인해보세요

자료구조 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.