마찬가지로 진입차수를 세면서 진입차수가 0이면 출력하고 0이되게 하나씩 줄여가는 방식으로 하였다.
위상정렬 예제를 보면서 풀었는데도 시간초과가 발생하였다. 왜 그런지 살펴보자.
틀린 코드
import sys
from collections import deque
sys.stdin=open('input.txt','r')
if __name__=="__main__":
N,M=map(int, input().split()) # N명의 학생, M번 비교
graph=[[] for _ in range(N+1)] # 처음에 2차원 배열로 graph[A][B]=1로 하였다가 메모리 초과가 발생
arr=[0]*(N+1)
Q=deque()
for _ in range(M):
A,B=map(int ,input().split())
graph[A].append(B)
arr[B]+=1 # 진입차수 기록
for i in range(1,N+1):
if arr[i]==0:
Q.append(i) # 진입차수가 0인거가 가장 우선순위로 출력
while Q:
x=Q.popleft()
print(x, end=' ')
for i in range(1,N+1):
if i in graph[x]: # 진입차수가 0인것과 연결된거
arr[i]-=1
if arr[i]==0:
Q.append(i)
정답 코드
import sys
from collections import deque
if __name__=="__main__":
N,M=map(int, input().split()) # N명의 학생, M번 비교
graph=[[] for _ in range(N+1)]
arr=[0]*(N+1)
Q=deque()
for _ in range(M):
A,B=map(int ,input().split())
graph[A].append(B)
arr[B]+=1
for i in range(1,N+1):
if arr[i]==0:
Q.append(i)
while Q:
x=Q.popleft()
print(x, end=' ')
for i in graph[x]: # 필요한것만 살펴보면 됐었다....
arr[i]-=1
if arr[i]==0:
Q.append(i)