오뚝이개발자

[백준 2252] 줄 세우기 본문

코딩 테스트/백준

[백준 2252] 줄 세우기

땅어 2021. 7. 4. 14:46
728x90
300x250

문제


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

 

 

나의 풀이


위상 정렬을 사용해 푸는 대표적인 문제이다. 위상 정렬의 개념을 모르겠으면 이 글을 참조하기 바란다.

 

코드


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

n, m = list(map(int, input().split()))

# adjacent list
adj_list = [[] for _ in range(n+1)]
# indegree list
indegree = [0 for _ in range(n+1)]
for _ in range(m):
    x, y = list(map(int, input().split()))
    adj_list[x].append(y)
    indegree[y] += 1

st = [] # save 0 indegree vertex
for i in range(1,n+1):
    if indegree[i] == 0:
        st.append(i)
answer = []
while st:
    v = st.pop()
    answer.append(v)
    for x in adj_list[v]:
        indegree[x] -= 1
        if indegree[x] == 0:
            st.append(x)
for x in answer:
    print(x, end=' ')




 

 

 

 

728x90
300x250

'코딩 테스트 > 백준' 카테고리의 다른 글

[백준 1013] Contact  (0) 2021.09.20
유레카 이론  (0) 2021.07.13
[백준 1937] 욕심쟁이 판다  (0) 2021.07.03
[백준9376] 탈옥  (0) 2020.05.15
[백준13913] 숨바꼭질 4  (0) 2020.05.14
Comments