백준|1766번|문제집

README·2023년 3월 21일
0

파이썬 PS풀이

목록 보기
130/136

문제 설명

N개의 문제가 있는 문제집에서 문제를 풀려고 하는데 어떤 문제는 해당 문제를 풀기 전에 풀어야 하는 문제가 있습니다. 문제를 푸는 순서를 지키면서 가능한 번호가 작은 문제부터 문제를 풀려고 할 때 어떤 순서로 문제를 풀어야 하는지 출력하는 문제입니다.

작동 순서

  1. 문제의 수와 문제 전에 풀어야 하는 문제의 수를 입력받습니다.
  2. 문제 번호 A와 A를 풀어야 풀 수 있는 문제의 번호 B를 입력받고 A의 자식으로 B를 추가하고 B의 먼저 풀어야 할 문제 수를 +1 해줍니다.
  3. 힙에 현재 바로 풀 수 있는 문제를 입력합니다.
  4. 힙에서 현재 풀 수 있는 문제 중 번호가 가장 작은 문제를 풀고 해당 문제를 풀면 풀 수 있는 문제가 있는지 확인하고 있을 경우 현재 풀 수 있는 문제에 추가하는 행동을 반복합니다.
  5. 모든 문제를 풀고 나면 지금까지 문제를 푼 순서를 출력합니다.

소스코드

import sys
import heapq
N, M = map(int, sys.stdin.readline().split())
graph = [[] for _ in range(N+1)]
matters = []
preSolve = [0] * (N+1)
ans = []

for i in range(M):
    A, B = map(int, sys.stdin.readline().split())
    graph[A].append(B)
    preSolve[B] += 1

for i in range(1, N+1):
    if preSolve[i] == 0:
        heapq.heappush(matters, i)

while matters:
    idx = heapq.heappop(matters)
    for n in graph[idx]:
        preSolve[n] -= 1
        if preSolve[n] == 0:
            heapq.heappush(matters, n)
    ans.append(idx)
print(*ans)
profile
INTP 개발자 지망생

0개의 댓글