PS/백준

[백준/BOJ] 2623번 - 음악프로그램 (Python)

행복한라이언 2023. 9. 29. 20:40
728x90
반응형

· 문제링크

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

 

2623번: 음악프로그램

첫째 줄에는 가수의 수 N과 보조 PD의 수 M이 주어진다. 가수는 번호 1, 2,…,N 으로 표시한다. 둘째 줄부터 각 보조 PD가 정한 순서들이 한 줄에 하나씩 나온다. 각 줄의 맨 앞에는 보조 PD가 담당한

www.acmicpc.net

· 핵심 : 위상 정렬 - 「 in-degree를 활용한 방법」

1.  방향성이 존재하는 그래프 생성 & 들어오는 간선 수 기록

→  3 1 4 3 

→ 3 : 가수의 수, 1 4 3 : 가수의 번호

→ 1 - 4 / 4 - 3 으로 그래프 연결

 

2. in-degree = 0인 후보들 적절한 자료구조(리스크, 큐, 스택, 힙 등)에 넣기

 

3. candiates가 전부 비워질 때까지 확인하기

→ candidates에 존재하는 후보군 하나씩 빼면서 연결된 in-degree 1개 제거 

→ 1개 제거 했을 때 만약 in-degree가 0이 된다면 candidates에 넣기


· 코드(Python)

# https://www.acmicpc.net/problem/2623
n, m = map(int, input().split())
adj = [[] for _ in range(n + 1)]
ind = [0 for _ in range(n + 1)]

for _ in range(m):
    nums = list(map(int, input().split()))
    for i in range(1, nums[0]):
        # 그래프 생성 - 방향성 존재
        adj[nums[i]].append(nums[i + 1])
        # 진입하는 경우 in-degree 증가
        ind[nums[i + 1]] += 1

# in-degree = 0 후보군 넣기
candidates = []
for i in range(1, n + 1):
    if ind[i] == 0:
        candidates.append(i)

result = []
while candidates:
    # 후보군에서 추출
    cur = candidates.pop()
    result.append(cur)
    # 추출 후 연결된 다음 노드들의 in-degree 제거
    for nxt in adj[cur]:
        ind[nxt] -= 1
        if ind[nxt] == 0:
            candidates.append(nxt)

if len(result) != n:
    print(0)
else:
    for num in result:
        print(num)
728x90
반응형