본문 바로가기
Python3/백준 알고리즘

2022.02.17 [백준] (python 파이썬) 줄 세우기

by ian's coding 2022. 2. 17.
728x90
반응형

 

https://www.acmicpc.net/problem/2252

 

2252번: 줄 세우기

첫째 줄에 N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의

www.acmicpc.net


풀이

다음 문제는 위상 정렬을 사용하면 쉽게 해결할 수 있다.

이유는 각 비교 학생들을 앞에 서야 하는 학생 쪽으로 화살표를 그리면 진입 차수와 진출 차수를 알 수 있다. 

그래서 진입 차수가 0이면 앞에 서야하는 학생이 없는 뜻이기 때문에 deque를 이용하여 진입차수가 0인 학생들을 result에 저장 후 출력했다. 이 때 각 학생의 진입 차수 즉 앞에 서야하는 학생의 수를 check에 카운트했다.

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
from collections import deque
 
n,m=map(int,input().split())
check=[0]*(n+1)
graph=[[] for _ in range(n+1)]
 
for _ in range(m):
    x,y=map(int, input().split())
    graph[x].append(y)
    check[y]+=1
 
result=[]
deq=deque()
 
for i in range(1,n+1):
    if check[i]==0:
        deq.append(i)
 
while deq:
    a=deq.popleft()
    result.append(a)
    for i in graph[a]:
        check[i]-=1
        if check[i]==0:
            deq.append(i)
for i in result:
    print(i,end=" ")
cs

 

 

 

 

728x90
반응형

댓글