Hanbit the Developer
[그래프] Python - 2252번, 줄 세우기 본문
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에서 세부적으로 우선순위를 정하는 것이다.
'Algorithm > 백준' 카테고리의 다른 글
[문자열] Python - 12904번, A와 B (0) | 2021.04.14 |
---|---|
[그리디] Python - 11497번, 통나무 건너뛰기 (0) | 2021.04.12 |
[DP] Python - 7579번, 앱 (0) | 2021.04.09 |
[BFS] Python - 2589번, 보물섬 (0) | 2021.04.08 |
[문자열] Python - 4358번, 생태학 (0) | 2021.04.07 |