LeetCode 133 Clone Graph 풀이: 방문 매핑을 사용하는 그래프 DFS
LeetCode 133 Clone Graph를 원본 노드와 복제 노드의 매핑을 이용한 DFS로 푼다. 복제 노드를 이웃 탐색 전에 저장해 순환을 처리하고 독립된 그래프를 만드는 과정을 다룬다.
노드와 간선의 관계를 탐색하고 복사하는 그래프 알고리즘 문제를 다룬다. 현재 4개의 풀이가 있다.
LeetCode 133 Clone Graph를 원본 노드와 복제 노드의 매핑을 이용한 DFS로 푼다. 복제 노드를 이웃 탐색 전에 저장해 순환을 처리하고 독립된 그래프를 만드는 과정을 다룬다.
LeetCode 130 Surrounded Regions에서 가장자리의 O와 연결된 영역을 BFS로 표시하고, 남은 O를 X로 바꾼다. 격자를 제자리에서 수정해 O(mn) 시간에 처리한다.
1번 노드에서 BFS로 모든 노드까지의 최단 간선 거리를 구한다. 최댓거리와 같은 거리를 가진 노드 수를 세는 풀이를 설명한다.
프로그래머스 순위에서 경기 결과를 방향 그래프로 나타내고 플로이드-워셜로 간접 승패 관계를 구한다. 승리·패배 수의 합으로 순위를 확정할 수 있는 선수를 찾는다.
필요한 주제만 펼쳐서 그래프의 핵심 개념을 익힌다.
그래프는 대상 사이의 관계를 노드와 간선으로 표현하는 자료구조다.
문제에서 도시와 도로, 사람과 친구 관계, 작업과 의존성이 등장하면 그래프로 모델링할 수 있는지 먼저 확인한다.
코딩 테스트에서는 입력 크기와 간선 수에 따라 그래프 저장 방식을 고른다.
| 표현 | 특징 | 적합한 상황 |
|---|---|---|
| 인접 리스트 | 각 노드에서 연결된 노드만 저장 | 간선이 적거나 일반적인 탐색 문제 |
| 인접 행렬 | 두 노드의 연결 여부를 표에 저장 | 노드 수가 작고 연결 여부를 자주 확인하는 문제 |
| 간선 목록 | 간선을 `(출발, 도착, 비용)` 형태로 저장 | 간선 자체를 정렬하거나 순회하는 문제 |
노드 수가 크고 간선 수가 제한적이면 보통 인접 리스트가 메모리와 탐색 시간 면에서 유리하다.
DFS는 한 경로를 끝까지 탐색한 뒤 돌아오고, BFS는 가까운 노드부터 같은 거리 순서로 탐색한다.
인접 리스트를 사용하면 두 탐색 모두 시간 복잡도는 `O(V + E)`다. 여기서 `V`는 노드 수, `E`는 간선 수다.
| 문제 조건 | 우선 고려할 방법 |
|---|---|
| 모든 연결 그룹 확인 | DFS, BFS |
| 가중치가 같고 최단 거리 | BFS |
| 양수 가중치의 최단 거리 | 다익스트라 |
| 작업 순서와 의존성 | 위상 정렬 |
| 모든 노드를 잇는 최소 비용 | 크루스칼, 프림 |
| 그룹 합치기와 연결 여부 | Union-Find |