새발블로그

인접리스트 Tip (list) 본문

Problem Solving/Refer

인접리스트 Tip (list)

EUG 2025. 7. 4. 17:30

그래프의 실전 구현 - 인접 리스트 (Adjacency List)

그래프를 컴퓨터 메모리 상에 표현하는 방법 중 가장 자주 사용되는 방식이 인접 리스트(Adjacency List) 이다.

이 방식은 메모리 효율이 높고, 연결된 노드들만 저장하기 때문에 희소 그래프(Sparse Graph) 에 특히 유리하다.

1. 인접 리스트란?

인접 리스트는 각 정점마다 연결된 정점들의 목록을 따로 저장하는 구조입니다. 자바에서는 이를 List<List<Integer>> 형태로 구현한다.

아래는 8개의 정점을 갖는 무방향 그래프를 인접 리스트로 표현한 코드입니다:

List<List<Integer>> graph = new ArrayList<>() {{
    add(List.of(1, 3, 6));     // 정점 0
    add(List.of(0, 3));        // 정점 1
    add(List.of(3));           // 정점 2
    add(List.of(0, 1, 2, 7));  // 정점 3
    add(List.of(5));           // 정점 4
    add(List.of(4, 6, 7));     // 정점 5
    add(List.of(0, 5));        // 정점 6
    add(List.of(3, 5));        // 정점 7
}};

 

2. 간선 정보로부터 인접 리스트 구성하기

실전 문제에서는 보통 간선 리스트(edge list) 형식으로 입력이 주어지며, 이를 직접 인접 리스트로 변환해야 한다.

예시 입력

int[][] edges = {
    {0, 1}, {0, 3}, {0, 6},
    {1, 3}, {2, 3}, {3, 7},
    {4, 5}, {5, 6}, {5, 7}
};
int n = 8; // 정점 개수

무방향 그래프 변환 코드

List<List<Integer>> graph = new ArrayList<>();
for (int i = 0; i < n; i++) {
    graph.add(new ArrayList<>());
}
for (int[] edge : edges) {
    int a = edge[0], b = edge[1];
    graph.get(a).add(b);
    graph.get(b).add(a); // 무방향일 경우
}

방향 그래프 변환 코드

List<List<Integer>> graph = new ArrayList<>();
for (int i = 0; i < n; i++) {
    graph.add(new ArrayList<>());
}
for (int[] edge : edges) {
    int from = edge[0], to = edge[1];
    graph.get(from).add(to); // 단방향일 경우
}

 

 

4. 연결된 노드 순회하기

기본 반복문

int curVertex = 3;  // 현재 노드

for (int nextVertex : graph.get(curVertex)) {
    System.out.println("현재: " + curVertex + " → 연결: " + nextVertex);
}

출력 예시

현재: 3 → 연결: 0
현재: 3 → 연결: 1
현재: 3 → 연결: 2
현재: 3 → 연결: 7

 

'Problem Solving > Refer' 카테고리의 다른 글

BFS 템플릿  (0) 2025.07.04
DFS 템플릿  (0) 2025.07.04
인접 행렬 tip  (0) 2025.07.04
인접 리스트 Tip (dict)  (0) 2025.07.04
시간복잡도 가이드  (0) 2025.07.04