Queue (BFS)

from collections import deque
 
q = deque()
q.append(start)
while q:
    cur = q.popleft()

Priority Queue (최소힙)

import heapq
 
hq = []
heapq.heappush(hq, (priority, value))
x = heapq.heappop(hq)

(priority, value) 형태로 우선순위 주기

실전 코테에서 가장 많이 쓰는 형태.

import heapq  
hq = [] 
heapq.heappush(hq, (priority, data))   
priority, data = heapq.heappop(hq)
  • priority가 작을수록 먼저 나온다
  • 여러 기준이 있으면 튜플로 확장하면 됨
    예:
import heapq
heapq.heappush(hq, (time, request_time, job_id))

여러 우선순위를 튜플로 처리 (자동 정렬)

파이썬에서는 튜플을 비교하면 앞 요소부터 차례로 비교한다.

import heapq
 
hq = []
for idx, (start, duration) in enumerate(jobs):
    heapq.heappush(hq, (duration, start, idx))
# (1순위: 소요시간, 2순위: 요청시간, 3순위: 작업번호) 

이렇게 하면 별도 compare 함수 없이도 다양한 우선순위 표현 가능.

최대힙(Max-Heap)처럼 사용하기

heapq는 최소힙이므로 음수(-) 를 붙여서 넣는다.

import heapq  
hq = [] 
heapq.heappush(hq, (-value, value)) 
max_value = heapq.heappop(hq)[1]

이미 정렬된 리스트를 힙으로 변환

heapq.heapify(arr)

가장 작은 N개 / 가장 큰 N개 요소 추출

import heapq  smallest = heapq.nsmallest(3, arr) largest = heapq.nlargest(3, arr)

DFS (재귀)

def dfs(x):
    visited[x] = True
    for nxt in graph[x]:
        if not visited[nxt]:
            dfs(nxt)

BFS

def bfs(start):
    q = deque([start])
    visited[start] = True
    while q:
        cur = q.popleft()
        for nxt in graph[cur]:
            if not visited[nxt]:
                visited[nxt] = True
                q.append(nxt)

그래프 인접 리스트 생성

graph = [[] for _ in range(n + 1)]
for a, b in edges:
    graph[a].append(b)
    graph[b].append(a)