본문 바로가기
알고리즘

음악프로그램 [백준 2623] - python

by 우보틀 2022. 2. 28.

import sys
input = sys.stdin.readline

def BOJ2623() :
  N, M = map(int, input().split())
  graph = [[] for _ in range(N+1)]
  count_of_line = [0] * (N+1)
  queue = []
  answer = []
  
  for _ in range(M) :
    temp = list(map(int, input().split()))
    _, b = temp[:2]
    temp_list = temp[2:]
    for i in temp_list :
      graph[b].append(i)
      count_of_line[i] += 1
      b = i

  for i in range(1, N+1) :
    if count_of_line[i] == 0 :
      queue.append(i)
      answer.append(i)

  while queue :
    temp = queue.pop(0)
    for i in graph[temp] :
      count_of_line[i] -= 1
      if count_of_line[i] == 0 :
        queue.append(i)
        answer.append(i)
  
  if len(answer) != N :
    print(0)
  else :
    for i in answer :
      print(i)

BOJ2623()

 

접근 방법 :

1. 위상정렬의 기본적인 문제이다. 위상정렬의 알고리즘 동작에 대한 내용은 이전 포스팅에서 진행하였어서 따로 적진 않으려 한다.

2. 입력을 처리하는 부분만 조금 까다로웠다. 

3. 2번만 잘 처리하고 나면 진입차수가 0인것부터 차례대로 접근하는 위상정렬의 기본 문제라 생각한다.

위상 정렬을 코드로 그려내는 것만 익숙하다면 해당 문제는 어렵지 않게 풀 수 있지 않을까 싶다.

 

 

 

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

 

2623번: 음악프로그램

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

www.acmicpc.net

 

'알고리즘' 카테고리의 다른 글

작업 [백준 2056] - python  (0) 2022.03.02
문제집 [백준 1766] - python  (1) 2022.03.01
줄 세우기[백준 2252] - python  (0) 2022.02.27
단지번호붙이기 [백준 2667] - python  (0) 2022.02.26
맥주 마시면서 걸어가기  (0) 2022.02.25