그래프(Graph)는 정점(Vertex)과 간선(Edge)으로 이루어진 자료구조입니다.
정점(Vertex): 데이터를 표현하는 노드
간선(Edge): 정점들을 연결하는 선
그래프는 방향성이 있는 경우와 없는 경우로 나뉘며, 간선에 가중치(Weight) 가 포함될 수도 있습니다.
그래프는 여러 유형으로 분류될 수 있습니다.
방향 그래프(Directed Graph)
무방향 그래프(Undirected Graph)
가중치 그래프(Weighted Graph)
그래프를 코드로 표현하는 방법에는 다음 세 가지가 있습니다.
각 방법마다 장점과 단점이 존재합니다.
| 표현 방법 | 메모리 효율성 | 탐색 속도 | 사용 예 |
|---|---|---|---|
| 정점 객체 | 정점 추가가 쉬움 | 탐색 시 성능 저하 | 객체 지향적인 접근 |
| 인접 리스트 | 메모리 절약 | 탐색 성능 다소 떨어짐 | 정점이 많고 간선이 적은 경우 |
| 인접 행렬 | 빠른 탐색 | 메모리 사용 증가 | 간선이 많은 경우 |
각 정점을 클래스로 생성하여 간선 정보를 관리하는 방식입니다.
using System;
using System.Collections.Generic;
class Vertex
{
public List<Vertex> edges = new List<Vertex>(); // 연결된 정점 목록
}
class Program
{
static void CreateGraph()
{
List<Vertex> v = new List<Vertex>(6)
{
new Vertex(),
new Vertex(),
new Vertex(),
new Vertex(),
new Vertex(),
new Vertex(),
};
v[0].edges.Add(v[1]); // v[0] → v[1], v[3] 연결
v[0].edges.Add(v[3]);
v[1].edges.Add(v[0]); // v[1] → v[0], v[2], v[3] 연결
v[1].edges.Add(v[2]);
v[1].edges.Add(v[3]);
v[3].edges.Add(v[4]); // v[3] → v[4] 연결
v[5].edges.Add(v[4]); // v[5] → v[4] 연결
}
static void Main(string[] args)
{
CreateGraph();
}
}
정점을 객체로 만들지 않고 리스트 배열을 사용하여 관리하는 방법입니다.
using System;
using System.Collections.Generic;
class Program
{
static void CreateGraph()
{
List<int>[] adjacent = new List<int>[6]
{
new List<int> {1, 3}, // v[0] → v[1], v[3]
new List<int> {0, 2, 3}, // v[1] → v[0], v[2], v[3]
new List<int> { }, // v[2] → 없음
new List<int> {4}, // v[3] → v[4]
new List<int> { }, // v[4] → 없음
new List<int> {4}, // v[5] → v[4]
};
}
static void Main(string[] args)
{
CreateGraph();
}
}
정점 간 연결을 2차원 배열로 관리하는 방식입니다.
using System;
class Program
{
static void CreateGraph()
{
int[,] adjacent = new int[6, 6]
{
{ 0, 1, 0, 1, 0, 0 }, // v[0] → v[1], v[3]
{ 1, 0, 1, 1, 0, 0 }, // v[1] → v[0], v[2], v[3]
{ 0, 1, 0, 0, 0, 0 }, // v[2] → v[1]
{ 1, 1, 0, 0, 1, 0 }, // v[3] → v[0], v[1], v[4]
{ 0, 0, 0, 1, 0, 1 }, // v[4] → v[3], v[5]
{ 0, 0, 0, 0, 1, 0 }, // v[5] → v[4]
};
}
static void Main(string[] args)
{
CreateGraph();
}
}
그래프의 간선에 가중치(weight) 를 부여할 수도 있습니다.
using System;
using System.Collections.Generic;
class Edge
{
public int Vertex;
public int Weight;
public Edge(int v, int w)
{
Vertex = v;
Weight = w;
}
}
class Program
{
static void CreateGraph()
{
List<Edge>[] adjacent = new List<Edge>[6]
{
new List<Edge> { new Edge(1, 15), new Edge(3, 35) },
new List<Edge> { new Edge(0, 15), new Edge(2, 5), new Edge(3, 10) },
new List<Edge> { },
new List<Edge> { new Edge(4, 5) },
new List<Edge> { },
new List<Edge> { new Edge(4, 5) },
};
}
static void Main(string[] args)
{
CreateGraph();
}
}
| 표현 방식 | 메모리 효율성 | 접근 속도 | 사용 예 |
|---|---|---|---|
| 정점 객체 | O(n) | O(n) | 객체 지향적인 접근 |
| 인접 리스트 | O(n + m) | O(n) | 간선이 적고 정점이 많은 경우 |
| 인접 행렬 | O(n²) | O(1) | 간선이 많은 경우 |