코딩테스트 파이썬/백준
음악프로그램 ( 2623 번 )
세용용용용
2025. 7. 5. 17:34
🧠 알고리즘
- 각 PD의 정보를 종합해 자식, 부모 정보 딕셔너리에 저장
- 위상 정렬을 수행.. ( 부모가 없으면 큐 삽입 )
- 최종, 모든 노드 방문 못하면 0.. 모든 노드 방문 시 줄 세운 결과 출력!!
🧾 코드
from collections import deque
import sys
def _mk(n, m):
a1, a2 = {}, {}
for i in range(1, n + 1):
a1[i], a2[i] = [], 0
for _ in range(m):
n_list = list(map(int, sys.stdin.readline().rstrip().split()))
for idx in range(1, len(n_list) - 1):
p, c = n_list[idx], n_list[idx + 1]
a1[p].append(c)
a2[c] += 1
return a1, a2
def _main(ch, pt, num):
answer = []
queue = deque([k for k, v in pt.items() if v == 0])
while queue:
now_q = queue.popleft()
answer.append(now_q) # 줄 세우기
for c in ch[now_q]:
pt[c] -= 1
if pt[c] == 0: # 더 이상 루트가 없는 경우..
queue.append(c)
if len(answer) != num: # 순서 정하는 것이 불가능..
return 0
return '\n'.join(map(str, answer))
n, m = map(int, sys.stdin.readline().rstrip().split())
ch, pt = _mk(n, m)
print(_main(ch, pt, n))
⏱️ 시간 복잡도
_mk() : 부모, 자식 종합 정보 구하는 함수 ( 이차형 시간 복잡도 )
_main() : 위상정렬 줄 세우기.. ( 선형 시간 복잡도 )
해당 알고리즘 시간 복잡도 : 이차형 시간 복잡도 ( O(n ** 2) )