[이것이 코딩 테스트다] with Python
[이것이 코딩 테스트다] 위상 정렬 알고리즘 with Python
Evolving Developer
2023. 6. 1. 11:47
📊위상 정렬
💡 위상 정렬이란 방향 그래프의 모든 노드를 방향성에 거스르지 않도록 순서대로 나열하는 것이다.
📊진입차수
특정한 노드로 들어오는 간선의 개수
만약 ‘알고리즘’이라는 과목이 2개의 선수과목을 가지고 있다면 ‘알고리즘’의 진입차수는 2이다.
📊위상 정렬 알고리즘
1️⃣ 진입차수가 0인 노드를 큐에 넣는다.
2️⃣ 큐가 빌 때까지 다음의 과정을 반복한다.
2️⃣-1️⃣ 큐에서 원소를 꺼내 해당 노드에서 출발하는 간선을 그래프에서 제거한다.
2️⃣-2️⃣ 새롭게 진입차수가 0이 된 노드를 큐에 넣는다.
💻 코드
from collections import deque
# 노드와 간선 개수 입력받기
v, e = map(int, input().split())
# 차수 저장 배열
indegree = [0] * (v+1)
# 그래프 정보 입력받기
graph = [[] for _ in range(v+1)]
for i in range(e):
n1, n2 = map(int, input().split())
graph[n1].append(n2)
indegree[n2] += 1
# 결과를 담을 배열
result = []
# 큐 생성
queue = deque()
# 차수가 0이라면 큐에 삽입
for n in range(1, v+1):
if indegree[n] == 0:
queue.append(n)
# 큐가 빌 때까지 반복
while queue:
# 현재 노드
now = queue.popleft()
# 결과에 추가
result.append(now)
# 현재 노드와 연결된 간선 제거
for n in graph[now]:
indegree[n] -= 1
# 만약 차수가 0이 됐다면
if indegree[n] == 0:
# 큐에 삽입
queue.append(n)
# 출력
for r in result:
print(r, end=' ')
입력
7 8 1 2 1 5 2 3 2 6 3 4 4 7 5 6 6 4
출력
1 2 5 3 6 4 7