이번 문제는 자신의 뒤에 서는 학생을 리스트로 가지는 그래프를 인접 리스트 형식으로 구현하고, 자신의 앞에 있는 학생의 수를 세는 리스트를 따로 만든 뒤, 이 두 개의 리스트를 사용하여 BFS 방식으로 탐색하여 해결하였다.
우선 자신의 앞에 있는 학생의 수가 0인 학생들을 큐에 모두 넣고, BFS 내부에서 큐에서 나온 학생 뒤에 서있는 학생에 대하여 그 학생 앞에 서있는 수를 1 감소시키고, 만약 앞에 서있는 수가 0이 되면 그 학생을 큐에 넣도록 하였고, 이 과정이 끝나면 큐에서 나온 학생은 정답 리스트에 들어가도록 하였다.
이 방법을 사용하면 자신의 앞에 아무도 없는 학생들부터 순서대로 정답 리스트에 들어가고 이때마다 이 학생의 뒤에 있는 학생들의 앞에 있는 수가 1씩 감소하게 되고, 결론적으로는 모든 학생이 정답 리스트에 들어가게 된다.
cnt[b]
를 1 증가시킨다.graph[a]
에 b를 넣는다.cnt[i]
가 0일 경우, q에 i를 넣는다.graph[cur]
을 순회하는 nxt에 대한 for문을 돌린다.cnt[nxt]
를 1 감소시킨다.cnt[nxt]
가 0일 경우, q에 nxt를 넣는다.answer[i]
를 공백을 두고 출력한다.from collections import deque
answer=[]
n, m=map(int, input().split())
arr=[]
graph=[[] for _ in range(n+1)]
cnt=[0 for _ in range(n+1)]
for _ in range(m):
a, b=map(int, input().split())
cnt[b]+=1
graph[a].append(b)
q=deque()
for i in range(1, n+1):
if cnt[i]==0:
q.append(i)
while q:
cur=q.popleft()
for nxt in graph[cur]:
cnt[nxt]-=1
if cnt[nxt]==0:
q.append(nxt)
answer.append(cur)
for i in range(n):
print(answer[i], end=' ')