알고리즘/문제풀이

[백준] 1766번 문제집 - 파이썬(Python)

SeongOnion 2021. 11. 11. 21:48
728x90

문제 (링크)

 

나의 풀이

import sys
import heapq
input = sys.stdin.readline

n, m = map(int, input().split())
in_degree = [0] * (n + 1)
graph = [[] for _ in range(n + 1)]

for _ in range(m):
    a, b = map(int, input().split())

    in_degree[b] += 1
    graph[a].append(b)

queue = []

for i in range(1, n + 1):
    if in_degree[i] == 0:
        heapq.heappush(queue, i)

while queue:
    current = heapq.heappop(queue)
    print(current, end=" ")

    for g in graph[current]:
        in_degree[g] -= 1

        if in_degree[g] == 0:
            heapq.heappush(queue, g)

코드 설명 및 풀이법

위상정렬 알고리즘의 아름다움에 빠져서 풀어본 문제이다.

 

일반적인 위상정렬과는 다르게, 2번 조건 때문에 매번 pop될 큐의 원소값은 최소값으로 갱신되어야한다.

 

약간 DFS와도 느낌이 비슷한데, 파이썬의 heapq 라이브러리를 사용해서 구현하였다. 

 

그 외에는 일반적인 위상정렬 알고리즘과 다르지 않다.