Krafton Jungle/2. Keywords

[WEEK03] 그래프의 종류와 표현 방식

munsik22 2025. 3. 27. 17:43

그래프의 정의

그래프(Graph)는 Vertex(=Node)로 이루어진 집합 V와 Edge(또는 Arc)으로 이루어진 집합이다.
  • 정점(Vertex, Node) A와 B는 간선(Edge) e에 의해 연결되어 있다.
    • A와 B는 서로 인접하다(adjacent).
    • e는 A와 B에 결합되어 있다(incident on).
  • 간선 e 외에도, A와 B는 호(Arc) a에 의해 연결되어 있다.
  • C는 다른 정점들과 연결되어 있지 않아 고립되어 있다(Isolated).

그래프의 종류

① 무방향 그래프(Undirected Graph)

  • 간선(Edge)에 방향이 없는 그래프
  • 정점 AB가 연결되었다면, A→B 와 B→A가 동일
  • 예: 친구 관계 네트워크

② 방향 그래프(Directed Graph, Digraph)

  • 간선(Edge)에 방향이 있는 그래프
  • A→BB→A가 다름
  • 예: 팔로우 관계(SNS), 웹페이지 링크

③ 가중 그래프(Weighted Graph)

  • 간선에 가중치(Weight)가 부여된 그래프
  • 거리, 비용, 시간 등의 개념을 표현 가능
  • 예: 도로망, 네트워크 흐름

그래프의 표현 방식

① 인접 행렬(Adjacency Matrix)

  • N×N 크기의 2차원 배열 사용 (N은 정점 개수)
  • 행렬의 값:
    • 무방향 그래프: A[i][j]=1 (연결됨), 0 (연결되지 않음)
    • 방향 그래프: A[i][j]=1 (방향 있음), 0 (없음)
    • 가중 그래프: A[i][j]= 가중치 값
  • 장점: 구현이 간단하고, 간선 존재 여부를 O(1)에 확인 가능
  • 단점: 공간복잡도가 O(N²)로 크며, 희소 그래프(Sparse Graph)에 비효율적

② 인접 리스트(Adjacency List)

  • 리스트(또는 해시맵)로 각 정점이 연결된 노드를 저장
  • 예: { A: [B, C], B: [A, D], C: [A], D: [B] }
  • 장점: 공간 효율적 (O(N+E)), 연결된 정점만 저장
  • 단점: 간선 존재 여부 확인이 O(N)으로 느릴 수 있음

💻 코드 구현

1️⃣ 인접 행렬 (Adjacency Matrix) 구현

  • 2차원 리스트를 사용하여 그래프를 표현
  • 간선이 있으면 1 (또는 가중치 값), 없으면 0
# 정점 개수
n = 4  

# 0으로 초기화된 n x n 행렬 생성
graph = [[0] * n for _ in range(n)]  

# 간선 추가 (무방향)
graph[0][1] = 1
graph[1][0] = 1
graph[1][2] = 1
graph[2][1] = 1
graph[2][3] = 1
graph[3][2] = 1

# 그래프 출력
for row in graph:
    print(row)

 

🔹 특징:

  • 공간 복잡도: O(N²)
  • 노드 연결 여부 확인: O(1)
  • 모든 간선 탐색: O(N²) (비효율적)

2️⃣ 인접 리스트 (Adjacency List) 구현

  • 딕셔너리 또는 리스트의 리스트를 사용
  • 각 정점이 인접한 정점 목록을 저장
# 인접 리스트 방식
graph = {
    0: [1],
    1: [0, 2],
    2: [1, 3],
    3: [2]
}

# 그래프 출력
for node, neighbors in graph.items():
    print(f"{node}: {neighbors}")

 

🔹 특징:

  • 공간 복잡도: O(N + E) (필요한 만큼만 저장)
  • 노드 연결 여부 확인: O(N)
  • 모든 간선 탐색: O(N + E) (효율적)

3️⃣ 가중 그래프 (Weighted Graph)

  • 딕셔너리 또는 튜플 활용
# 인접 리스트 방식 (가중치 포함)
graph = {
    0: [(1, 10), (2, 5)],  # (노드, 가중치)
    1: [(2, 2)],
    2: [(3, 1)],
    3: []
}

# 그래프 출력
for node, edges in graph.items():
    print(f"{node}: {edges}")

'Krafton Jungle > 2. Keywords' 카테고리의 다른 글

[WEEK03] 스패닝 트리와 MST  (0) 2025.03.28
[WEEK03] DFS와 BFS  (0) 2025.03.28
[WEEK02] 분할 정복  (0) 2025.03.24
[WEEK02] 연결 리스트와 해시 테이블  (0) 2025.03.22
[WEEK02] 원형 큐, 우선순위 큐  (0) 2025.03.22