dukongmon

Queue & BFS 본문

Python/Algorithm & Data Structure

Queue & BFS

duiiminish 2026. 6. 8. 05:35

그래프 탐색 대표 알고리즘 DFS / BFS

  • 탐색(Search)란 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정
  • 코테에서 매우 자주 등장하는 유형

Queue

  • 입구와 출구가 모두 뚫려있는 터널과 같은 형태
  • FIFO(First In First Out) 구조 : 먼저 들어온 데이터가 먼저 나가는 선입선출 형식의 자료구조

컨베이어 벨트처럼 들어온대로 나가는 구조!

EX ) 삽입(5) - 삽입(2) - 삽입(3) - 삽입(7) - 삭제() - 삽입(1) - 삽입(4) - 삭제()

⇒ 5 2 3 7 1 4

 

  • List 자료형을 이용해 기능적으로는 큐를 구현할 수 있음
  • But, List는 시간 복잡도가 더 높아서 비효율적으로 동작할 수 있음
    • 만약 pop()으로 원소를 꺼내면 그 후에 나머지 원소들의 위치를 조정해줘야 하기 때문에 O(k)만큼의 시간복잡도가 요구됨
  • deque는 스택과 큐 라이브러리의 장점을 합쳐놓은 자료구조
from collections import deque
# collections 모듈에서 deque 함수만 쓰겠다.

# queue 구현을 위해 deque 라이브러리 활용
queue = deque()

# 삽입(5)-삽입(2)-삽입(3)-삽입(7)-삭제()-삽입(1)-삽입(4)-삭제()
queue.append(5)
queue.append(2)
queue.append(3)
queue.append(7)
queue.popleft()
queue.append(1)
queue.append(4)
queue.popleft()

# 넣은 순서대로 queue list 출력 = 출구에 가까운 순
print(queue)
# 데크 없이 리스트 형태만 출력하고 싶다면
print(list(queue))

# 나중에 들어온 원소부터 출력
queue.reverse()
print(queue)
deque([3, 7, 1, 4])
[3, 7, 1, 4]
deque([4, 1, 7, 3])
  • 큐의 append()와 popleft()의 시간복잡도는 O(1). 상수시간

BFS(Breadth-First Search) : 깊이우선탐색

BFS : 너비 우선 탐색이라고도 부르며, 그래프에서 가까운 노드부터 우선적으로 탐색하는 알고리즘

BFS 특징

  • 큐 자료구조를 이용함
  • 루트 노드나 시작 정점에서 출발해 가장 가까운 인접 노드를 먼저 모두 방문한 뒤, 넓게 퍼져나가며 탐색하는 그래프/트리 탐색 알고리즘
  • DFS와의 가장 큰 차이로, 여러 갈래 중 무한한 길이를 가지는 경로가 존재하고 탐색 목표가 다른 경로에 존재하는 경우 BFS는 모든 경로를 동시에 진행하기 때문에 탐색이 가능하다는 특징이 있음
  • 한 갈림길에서 연결되는 모든 길을 한번씩 탐색하기 때문에 가중치가 없는 그래프에서는 시작점에서 끝점까지의 최단경로를 알아낼 수 있음

from collections import deque

def bfs(graph, start, visited) :
    queue = deque([start])
    visited[start] = True
    while queue :
        v = queue.popleft()
        print(v, end=' ')
        for i in graph[v] :
            if not visited[i] :
                # print(f"\n방문하지 않은 {i} 추가")
                queue.append(i)
                visited[i] = True

graph=[
    [],
    [2,3,8],
    [1,7],
    [1,4,5],
    [3,5],
    [3,4],
    [7],
    [2,6,8],
    [1,7]
]

visited = [False]*9
# print(visited)

bfs(graph,1,visited)
1 2 3 8 7 4 5 6

 

 

 

 

 

재귀 함수(Recursive Function)

자기 자신을 다시 호출하는 함수를 의미DFS, BFS에서 많이 사용함무한히 재귀 함수를 반복하면 어느정도 출력하다 최대 재귀 깊이 초과 메시지 출력됨RecursionError: maximum recursion depth exceeded while call

kongs-code.tistory.com

참고 : 동빈나 DFS & BFS

'Python > Algorithm & Data Structure' 카테고리의 다른 글

MST와 Union-Find, Kruskal 알고리즘  (0) 2026.06.12
Stack & DFS  (0) 2026.06.08
재귀 함수(Recursive Function)  (0) 2026.06.08