본문 바로가기

알고리즘/백준

[BOJ] [Python] 14567 : 선수과목 (Prerequisite)

위상 정렬로 해결했다.

 

 

import sys
input = sys.stdin.readline

n, m = map(int, input().split())

dp = [0] * (n + 1)

queue = []

graph = []
check = [0] * (n + 1)

result = [1] * (n + 1)

for _ in range(n + 1):
    graph.append([])

for _ in range(m):
    A, B = map(int, input().split())

    graph[A].append(B)
    check[B] += 1  # 진입 차수

    dp[B] = 1

for i in range(1, len(dp)):
    if dp[i] == 0:
        queue.append(i)

        result[i] = 1

while queue:

    num = queue.pop(0)

    if not graph[num]:
        continue

    for next_num in graph[num]:
        check[next_num] -= 1

        if check[next_num] == 0:
            result[next_num] = result[num] + 1

            queue.append(next_num)

print(*result[1:])

 

진입차수가 0일 때, 현재 노드의 순서가 결정된다.

이는 부모 노드의 순서에서 1을 더한 값이다.

 

 

주의할 점은

 

1. 과목은 1번 ~ N번까지 있다.

입력에 없지만, 범위(1~N) 안에 든다면 이 정점의 전입 차수는 0이다.

 

2. A에서 B로 간다고 했을 때, B가 없는 경우

B가 없는 경우에는 continue로 처리한다.

'알고리즘 > 백준' 카테고리의 다른 글

[BOJ] [Python] 16562 : 친구비  (0) 2021.10.06
[BOJ] [Python] 1005 : ACM Craft  (0) 2021.10.02
[BOJ] [Python] 1316 : 그룹 단어 체커  (0) 2021.09.29
[BOJ] [Python] 1764 : 듣보잡  (0) 2021.09.29
[BOJ] [Python] 20438 : 출석체크  (0) 2021.09.26