본문 바로가기

알고리즘/백준

[백준]1766 문제집(Python)

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

 

1766번: 문제집

첫째 줄에 문제의 수 N(1 ≤ N ≤ 32,000)과 먼저 푸는 것이 좋은 문제에 대한 정보의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 둘째 줄부터 M개의 줄에 걸쳐 두 정수의 순서쌍 A,B가 빈칸을 사이에 두고 주

www.acmicpc.net

 

문제 접근

 

선행 문제를 풀어야 후행 문제를 풀 수 있다는 점에서 위상정렬 알고리즘을 사용해야한다.

하지만 답이 여러 개인 경우에는 아무거나 출력한다는 조건이 없기에 정답은 하나이다.

이 문제의 조건에서는 "가능한 쉬운 문제부터 풀어야 한다"라는 조건이 있다.

 

코드
from collections import deque
import sys
import heapq

input = sys.stdin.readline

# 문제 수, 순서 정보의 개수
n, m = map(int, input().split())

# 모든 노드에 대한 진입차수는 0으로 초기화
indegree = [0] * (n+1)

# 각 노드에 연결된 간선 정보를 담기 위한 그래프 초기화
graph = [[] for i in range(n+1)]

# 방향 그래프의 모든 간선 정보 입력
for _ in range(m):
    a, b = map(int, input().split())
    graph[a].append(b)  # a -> b
    # 진입차수 1 증가
    indegree[b] += 1

hp = []
# 처음 시작할 때는 진입차수가 0인 노드를 우선순위 큐에 삽입(1부터 v까지 체크)
for i in range(1, n+1):
    if indegree[i] == 0:
        heapq.heappush(hp, i)


while hp:
    now = heapq.heappop(hp)
    print(now, end = " ")
    # now와 연결된 노드들의 진입차수-1
    for i in graph[now]:
        indegree[i] -= 1
        # 새롭게 진입차수가 0이 되는 노드를 큐에 삽입
        if indegree[i] == 0:
            heapq.heappush(hp, i)

 

문제 회고

 

기존의 위상정렬 문제와 다르게 가능한 앞 번호의 문제부터 푸는 것이 유리하다는 조건이 있기에 우선순위 큐(heapq)를 이용하는 것이 생소했다. 

'알고리즘 > 백준' 카테고리의 다른 글

[백준]2096 내려가기(Python)  (1) 2024.02.03
[백준]3665 최종순위(Python)  (1) 2024.01.30
[백준]1005 ACM Craft(Python)  (1) 2024.01.28
위상정렬  (1) 2024.01.27
[백준]2252 줄세우기(Python)  (0) 2024.01.27