정의
정점(노드)와 간선(연결선)으로 이루어진 자료 구조를 말한다.
종류
무방향 그래프
간선에 방향이 없음 (친구 관계)
방향 그래프
간선에 방향 있음 (트위터 팔로잉)
가중치 그래프
간선마다 가중치(거리, 비용 등)이 부여됨
왜 하나요?
그래프 내의 모든 노드나 특정 노드를 방문하기 위하여
주요 방법론
원리
한 노드에서 시작하여 끝까지 깊게 들어간 후 더이상 들어갈 수 없다면 다시 돌아와서 다른길을 탐색한다.
구현
주로 재귀 함수나 스택(후입 선출 구조)를 사용함
특징
예시
def dfs(graph, node, visited): visited.add(node) print(node, end=" ") # 방문한 노드 출력 for neighbor in graph[node]: if neighbor not in visited: dfs(graph, neighbor, visited) # 간단한 무방향 그래프 예시 graph = { 'A': ['B', 'C'], 'B': ['A', 'D', 'E'], 'C': ['A', 'F'], 'D': ['B'], 'E': ['B', 'F'], 'F': ['C', 'E'] } visited = set() dfs(graph, 'A', visited) # 출력 예: A B D E F C
예시
from collections import deque def bfs(graph, start): visited = set() queue = deque([start]) visited.add(start) while queue: node = queue.popleft() print(node, end=" ") # 방문한 노드 출력 for neighbor in graph[node]: if neighbor not in visited: visited.add(neighbor) queue.append(neighbor) # 간단한 무방향 그래프 예시 graph = { 'A': ['B', 'C'], 'B': ['A', 'D', 'E'], 'C': ['A', 'F'], 'D': ['B'], 'E': ['B', 'F'], 'F': ['C', 'E'] } bfs(graph, 'A') # 출력 예: A B C D E F
DFS
한 방향으로 쭉 들어가고, 모든 경로를 탐색하며, 깊이 있는 탐색에 유리하다.
메모리 사용량은 비교적 적은 편
BFS
가까운 노드부터 차례대로 탐색하며, 최단 경로를 보장한다.
큐 사용으로 메모리 부담이 있을 수 있다.
DFS의 경우 미로찾기. 퍼즐문제, 백트래킹에 나오고BFS의 경우 최단 경로, 레벨별 탐색(친구 추천 시스템) 등에 나온다.