728x90
1766. 문제집
난이도 : 골드 2
소요 시간 : 20분
날짜 : 2024.12.26
언어 : 파이썬
알고리즘 유형 : 위상정렬, 방향 비순환 그래프, 우선순위 큐, 그래프
설명 보기전에 문제 풀어보러 가기
1. 문제 설명
- n개의 문제를 모두 풀어야 한다.
- 문제 번호가 낮으면 더 쉬운 문제이다.
- 쉬운 문제를 먼저 풀어야 한다.
- 먼저 푸는 것이 좋은 문제가 있는 문제는, 먼저 푸는 것이 좋은 문제를 반드시 먼저 풀어야 한다.
2. 해결 방식
- 위상정렬과 우선순위큐를 활용하여 해결한다.
- 먼저 해결해야하는 문제가 주어졌다 == 위상정렬
- 쉬운문제(번호가 낮은 문제)를 먼저 풀어야 한다 == 우선순위 큐
- 그냥 큐를 사용해서 푸는 위상정렬 문제에서 큐를 우선순위 큐로 바꾸면 해결된다.
- 문제 번호 낮은게 먼저 풀어야 하기 때문에, 그냥 우선순위 큐에 문제 번호를 넣어서 위상정렬을 하면 끝!
3. 정답 코드
import sys
sys.stdin = open("C:/Users/ghtjd/Desktop/tmp/python/input.txt", "r")
# input = sys.stdin.readline
from collections import defaultdict
from heapq import heappop, heappush
n, m = map(int, input().split())
orders = [0] * (n + 1) # orders[i] = 먼저 풀어야 할 문제 개수(몇 문제를 풀어야 i번문제를 풀 수 있는가)
arr = defaultdict(list) # arr[i] = 후에 풀어야 할 문제 개수(i번 문제를 풀어야만 풀 수 있는 문제들 리스트)
for _ in range(m):
a, b = map(int, input().split())
orders[b] += 1
arr[a].append(b)
q = []
for i in range(1, n + 1):
if orders[i] == 0:
heappush(q, i) # 먼저 풀어야 하는 문제가 없는 애들만 q에 넣기
res = ''
while q:
now = heappop(q)
res += str(now) + ' ' # 결과를 바로 문자열로 저장하기
for next in arr[now]:
orders[next] -= 1 # 먼저 풀 게 하나 줄었다.
if orders[next] == 0: # 먼저 풀 게 없어졌다면 q에 넣기
heappush(q, next)
print(res)
반응형
'백준 문제풀이 코드저장소 > Gold' 카테고리의 다른 글
Baekjoon 19236. 청소년 상어 / Python (0) | 2024.12.27 |
---|---|
Baekjoon 9527. 1의 개수 세기 (0) | 2024.12.27 |
Baekjoon 1509. 팰린드롬 분할 / Python (0) | 2024.12.25 |
Baekjoon 16946. 벽 부수고 이동하기 4 / Python (0) | 2024.12.24 |