1. 2차원 배열을 만들어서 예를들어 2->3으로 간다면 arr[2][3]=1 을 해줘서 선후 관계를 표현해준다
2. 1차원 배열을 만들어서 진입 차수 (들어오는 차수)의 개수를 입력한다. 예를 들어 2->3 으로 간다면 arr[3]+=1 을 해주고, 4->3 으로 간다면 arr[3]+=1 을 해줘서 arr[3]=2 가 된다
3. 진입 차수가 0인 노드를 큐에 쌓아주고, pop 하면서 그 노드가 가리키는 노드의 진입차수를 -1 해주고
4. 노드의 진입차수를 -1 해줬는데 0의 값이 되었으면 더이상 그 노드를 가리키는 노드가 없으므로 큐에 쌓아준다
5. 큐 popleft 한 순서대로 print를 해준다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
if __name__=='__main__':
n, m = map(int, input().split())
graph = [[0]*(n+1) for _ in range(n+1)] # 그래프 선후관계 표현을 위한 2차원 배열
arr = [0] * (n+1) # 그래프 진입 차수의 기록을 위한 1차원 배열
for i in range(m):
start, end = map(int, input().split())
graph[start][end] = 1 # 그래프의 선후 관계를 입력을 받으며 기록한다
arr[end] += 1
queue = deque()
for i in range(1, n+1): # 먼저 아무 진입 차수도 받지 못한 (0) 노드의 인덱스를
if arr[i] == 0: # 큐에 쌓아준다
queue.append(i)
while queue:
now = queue.popleft() # 큐를 pop을 해주면서
print(now, end=' ')
for i in range(1, n+1):
if graph[now][i] == 1: # 현재 노드가 가리키는 노드가 있다면
arr[i] -= 1 # 그 노드에 대한 진입차수를 일단 -1 해주고
if arr[i] == 0: # 그 노드의 진입 차수가 0이 되버린 경우
queue.append(i) # 큐에다 쌓아준다
|
cs |
728x90
'Data Structures & Algorithms' 카테고리의 다른 글
[프로그래머스] 윤년 요일 찾기 (0) | 2022.11.03 |
---|---|
[Algorithms] 동적 계획법(Dynamic Programming)-최대 점수 구하기(냅색 알고리즘) (0) | 2022.06.09 |
[Algorithms] 동적 계획법(Dynamic Programming)-동전 교환(냅색 알고리즘) (0) | 2022.06.08 |
[Algorithms] 동적 계획법(Dynamic Programming)-가방문제(냅색 알고리즘) (0) | 2022.06.08 |
[Algorithms] 동적 계획법(Dynamic Programming)-알리바바와 40인의 도둑(Bottom-Up & Top-Down) (0) | 2022.06.07 |