본문 바로가기
TYLER SONG2026
블로그 목록
CS학습

그래프(Graph): 노드와 간선의 연결로 표현되는 비선형 자료구조

그래프는 객들 간의 관계를 나타내는 데 유용한 자료구조입니다. 특히, 네트워크, 소셜 관계, 경로 탐색 등 복잡한 시스템 모델링에 효과적입니다. 노드(Node)와 간선(Edge)으로 구성되며, 다양한 형태로 표현될 수 있습니다. 그래프 탐색 알고리즘은 효율적인 데이터 처리 및 문제 해결에 핵심적인 역할을 합니다.

송민성4분 읽기

1. 개념

그래프(Graph)는 노드(Node) 또는 정점(Vertex)이라고 불리는 객들의 집합과, 노드들을 연결하는 간선(Edge) 또는 호(Arc)의 집합으로 이루어진 자료구조입니다.

  • 노드(Node/Vertex): 데이터를 저장하는 객체입니다.
  • 간선(Edge/Arc): 노드 간의 관계를 나타냅니다. 방향이 있는 간선은 방향 그래프(Directed Graph), 없는 간선은 무방향 그래프(Undirected Graph)라고 합니다.
  • 인접 노드(Adjacent Node): 특정 노드와 직접 간선으로 연결된 노드입니다.
  • 가중치(Weight): 간선에 부여된 값으로, 거리, 비용, 시간 등을 나타낼 수 있습니다. 가중치가 있는 그래프는 가중 그래프(Weighted Graph)라고 합니다.

2. 왜 사용하는가

그래프는 다음과 같은 경우에 효과적으로 사용됩니다.

  • 관계 표현: 소셜 네트워크, 웹 페이지 연결, 도시 간의 도로망 등 객들 간의 관계를 명확하게 표현할 수 있습니다.
  • 경로 탐색: 최단 경로 찾기, 네트워크 라우팅 등 경로 기반 문제를 해결하는 데 유용합니다.
  • 네트워크 모델링: 컴퓨터 네트워크, 통신 네트워크 등 복잡한 네트워크 구조를 모델링하는 데 적합합니다.
  • 의존성 분석: 프로젝트의 작업 의존성, 소프트웨어 모듈 간의 의존성 등을 분석하는 데 활용됩니다.

3. 동작 원리

그래프는 여러 가지 방법으로 표현할 수 있습니다. 주로 사용되는 표현 방식은 다음과 같습니다.

  • 인접 행렬(Adjacency Matrix): 노드의 개수가 N개인 그래프에서 N x N 크기의 2차원 배열을 사용하여 간선의 존재 여부를 나타냅니다. matrix[i][j] = true는 노드 i와 노드 j 사이에 간선이 있음을 의미합니다.
  • 인접 리스트(Adjacency List): 각 노드에 연결된 인접 노드들의 리스트를 저장합니다. 메모리 효율성이 높지만, 특정 간선의 존재 여부를 확인하는 데 시간이 더 걸릴 수 있습니다.

4. 코드 예제

다음은 Python으로 인접 리스트를 사용하여 그래프를 구현하는 예제입니다.

python
class Graph: def __init__(self): self.graph = {} def add_node(self, node): if node not in self.graph: self.graph[node] = [] def add_edge(self, node1, node2): if node1 in self.graph and node2 in self.graph: self.graph[node1].append(node2) self.graph[node2].append(node1) # 무방향 그래프 def print_graph(self): for node in self.graph: print(f"{node}: {self.graph[node]}") # 그래프 생성 graph = Graph() graph.add_node('A') graph.add_node('B') graph.add_node('C') graph.add_node('D') # 간선 추가 graph.add_edge('A', 'B') graph.add_edge('B', 'C') graph.add_edge('C', 'D') graph.add_edge('D', 'A') # 그래프 출력 graph.print_graph()

5. 시간 복잡도 또는 성능 특성

  • 인접 행렬:

* 노드 추가: O(1) * 간선 추가: O(1) * 두 노드 간의 연결 여부 확인: O(1) * 노드 인접 노드 확인: O(N) (N은 노드 개수)

  • 인접 리스트:

* 노드 추가: O(1) * 간선 추가: O(1) * 두 노드 간의 연결 여부 확인: O(K) (K는 노드의 인접 노드 개수) * 노드 인접 노드 확인: O(K)

일반적으로 노드 수가 적고 간선이 많은 경우 인접 리스트가 메모리 효율적이며, 노드 수가 많고 간선이 적은 경우 인접 행렬이 유리합니다.

6. 실무 사용 사례

  • 추천 시스템: 사용자 간의 관계, 상품 간의 관계 등을 그래프로 모델링하여 추천 알고리즘에 활용합니다.
  • 지도 서비스: 도시의 도로망을 그래프로 표현하여 최단 경로 탐색 알고리즘 (다익스트라 알고리즘, A* 알고리즘 등)을 사용하여 사용자에게 최적의 경로를 제공합니다.
  • 소셜 네트워크 분석: 소셜 네트워크의 사용자 관계를 그래프로 분석하여 영향력 있는 사용자, 커뮤니티 등을 파악합니다.
  • 네트워크 보안: 네트워크의 연결 관계를 그래프로 모델링하여 공격 경로를 탐지하고 보안 취약점을 분석합니다.

7. 주의할 점

  • 메모리 사용량: 그래프의 크기가 매우 커질 경우, 메모리 사용량이 문제가 될 수 있습니다. 적절한 표현 방식을 선택하고, 메모리 효율적인 알고리즘을 사용하는 것이 중요합니다.
  • 무한 루프: 그래프 탐색 알고리즘을 구현할 때, 순환(Cycle)이 존재하는 그래프에서 무한 루프에 빠지지 않도록 주의해야 합니다. 방문한 노드를 기록하여 중복 방문을 방지하는 방법을 사용합니다.
  • 가중치 음수: 다익스트라 알고리즘과 같은 최단 경로 알고리즘은 가중치가 음수인 경우 정확한 결과를 보장하지 못합니다. 벨만-포드 알고리즘(Bellman-Ford algorithm)과 같은 음수 가중치를 처리할 수 있는 알고리즘을 사용해야 합니다.

8. 핵심 정리

그래프는 객들 간의 관계를 표현하는 강력한 자료구조입니다. 인접 행렬과 인접 리스트를 이용하여 그래프를 표현할 수 있으며, 다양한 그래프 탐색 알고리즘을 통해 효율적인 데이터 처리 및 문제 해결이 가능합니다. 실무에서는 추천 시스템, 지도 서비스, 소셜 네트워크 분석 등 다양한 분야에서 활용됩니다.

© 2026 Tyler Song