Algorithm/백준
[그래프] Python - 2252번, 줄 세우기
hanbikan
2021. 4. 11. 12:08
2252번: 줄 세우기
첫째 줄에 N(1≤N≤32,000), M(1≤M≤100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의미이
www.acmicpc.net
import sys
N, M = map(int, input().split())
graph = [[] for _ in range(N+1)]
degree = [0 for _ in range(N+1)]
for _ in range(M):
inputL, inputR = map(int, input().split())
degree[inputR] += 1
graph[inputL].append(inputR)
todo = []
for i in range(1, N+1):
if degree[i] == 0:
todo.append(i)
while todo:
curHead = todo.pop(0)
for node in graph[curHead]:
degree[node] -= 1
if degree[node] == 0:
todo.append(node)
print(curHead, end=" ")
degree라는 것을 부여하여, 출력 우선순위를 정한다.
degree가 0인 것들만을 담게 될 todo 리스트를 만들고, 이를 기준으로 출력해준다. 맨 앞의 것을 pop해주고, 그것보다 키가 작은 학생들을 돌면서 degree를 -1 해주는데, 해당 학생의 degree가 0이 될 경우 todo 리스트에 넣어준다.
이렇게 graph와 degree를 두 개를 이용하여 푸는 것이 핵심이다. graph는 입력받은 상하관계만을 저장해주되, degree에서 세부적으로 우선순위를 정하는 것이다.