코딩 테스트/백준

[백준 2252번] 줄 세우기

nan-noo 2023. 4. 15. 01:38
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

2023.04.11 - [코딩 테스트/개념] - Topological sort

# 1 <= N <= 32000
# 1 <= M <= 100000
# no cycle, directed graph

import sys
from collections import deque

readline = sys.stdin.readline

N, M = map(int, readline().split())

graph = [[] for _ in range(N + 1)]
indegree = [0 for _ in range(N + 1)]
for i in range(1, M + 1):
    A, B = map(int, readline().split())  # A -> B
    graph[A].append(B)
    indegree[B] += 1

tp = []
queue = deque()
for i in range(1, N + 1):
    if indegree[i] == 0:
        queue.append(i)

while len(tp) < N and queue:
    v = queue.popleft()
    tp.append(v)

    for adj_v in graph[v]:
        indegree[adj_v] -= 1
        if indegree[adj_v] == 0:
            queue.append(adj_v)

print(" ".join(map(str, tp)))

진입 차수(in-degree)가 0인 노드를 골라서 위상 정렬 배열에 추가하고, 해당 노드와 연결된 인접 노드들을 인접 리스트를 통해 찾고 진입 차수를 1씩 감소시키는 방식으로 정렬이 이뤄진다. 

다만, 진입 차수가 0인 노드를 고를 때 while문 안에서 반복문으로 찾으면 시간 초과가 발생한다. 따라서 queue를 이용해 0인 노드들을 저장하고 꺼내서 사용하는 방식으로 수정했다.

728x90

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

[백준 9663번] N-Queen  (2) 2023.04.15
[백준 1916번] 최소 비용 구하기  (0) 2023.04.15
[백준 1976번] 여행 가자  (0) 2023.04.15
[백준 1717번] 집합의 표현  (0) 2023.04.14
[백준 2193번] 이친수  (0) 2023.04.14