728x90
반응형
https://www.acmicpc.net/problem/2623
2623번: 음악프로그램
첫째 줄에는 가수의 수 N과 보조 PD의 수 M이 주어진다. 가수는 번호 1, 2,…,N 으로 표시한다. 둘째 줄부터 각 보조 PD가 정한 순서들이 한 줄에 하나씩 나온다. 각 줄의 맨 앞에는 보조 PD가 담당한
www.acmicpc.net
문제 해결
- 위상정렬의 대표적인 문제이다.
- 위상정렬이란 사이클이 없는 방향 그래프에 노드 순서를 찾는 알고리즘이다.
- 앞에 필요한 순서가 없는 것을 indegree=0으로 두고 앞에 노드가 이어져있으면 +1 씩 해서
- 나중에 시작 가능한 지점부터 돌 때 노드가 연결되서 지나갈 때마다 indegree를 1씩 줄여 indegree=0이 되는 순서대로 출력시키는 문제이다.
- 만약 사이클이 생겨 한 문자가 중복되서 돌게 되면 모순이 있는 것이므로 0을 출력하면 된다.
CODE
import sys
from collections import deque
n, m = map(int, input().split())
indegree = [0]*(n+1)
graph = [[] for _ in range(n+1)]
for _ in range(m):
x, *order = map(int, input().split())
for i in range(len(order)-1):
indegree[order[i+1]] += 1
graph[order[i]].append(order[i+1])
que = deque()
for i in range(1,n+1):
if indegree[i] ==0:
que.append(i)
answer = []
while que:
now = que.popleft()
answer.append(now)
for next in graph[now]:
indegree[next] -= 1
if indegree[next]==0:
que.append(next)
if len(answer) != n:
print(0)
else:
for i in range(n):
print(answer[i])
728x90
반응형
'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글
[python] 백준 10800 컬러볼 (0) | 2023.05.04 |
---|---|
[python] 백준 22862 가장 긴 짝수 연속한 부분 수열 (large) (0) | 2023.05.04 |
[python] 백준 2166 다각형의 면적 (0) | 2023.05.02 |
[python] 백준 5582 공통 부분 문자열 (0) | 2023.05.01 |
[python] 백준 13460 구슬 탈출 2 (0) | 2023.04.30 |
댓글