0. 문제 링크
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
1. 풀이 방법
2023.08.13 - [Computer Science/알고리즘] - [백준 - Python] 1766 - 문제집
[백준 - Python] 1766 - 문제집
0. 문제 링크 https://www.acmicpc.net/problem/1766 1766번: 문제집 첫째 줄에 문제의 수 N(1 ≤ N ≤ 32,000)과 먼저 푸는 것이 좋은 문제에 대한 정보의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 둘째 줄부터 M개의 줄
hi-guten-tag.tistory.com
위의 문제처럼 위상 정렬을 사용해서 푸는 문제이다.
2. 코드
import sys
from collections import deque
input = sys.stdin.readline
if __name__ == "__main__":
n, m = map(int, input().split())
subSequenceList = [[] for _ in range(n + 1)] # 내 뒤에 오는 애들
degree = [0] * (n + 1) # 내 앞에 몇개 필요한지
dq = deque()
ans = []
for _ in range(m):
a, b = map(int, input().split())
subSequenceList[a].append(b)
degree[b] += 1
for i in range(1, n + 1):
if degree[i] == 0:
dq.append(i)
while dq:
prior = dq.popleft()
ans.append(prior)
for sub in subSequenceList[prior]:
degree[sub] -= 1
if degree[sub] == 0:
dq.append(sub)
print(*ans, sep=' ')
3. 마무리
'Computer Science > 알고리즘' 카테고리의 다른 글
[백준 - Python] 2812 - 크게 만들기 (0) | 2023.08.25 |
---|---|
[백준 - Python] 1644 - 소수의 연속합 (0) | 2023.08.25 |
[백준 - Python] 16637 - 괄호 추가하기 (0) | 2023.08.20 |
[백준 - Python] 16724 - 피리 부는 사나이 (0) | 2023.08.13 |
[백준 - Python] 15684 - 사다리 조작 (0) | 2023.08.13 |