프로그래밍 공방

[백준] 2623번 : 음악 프로그램 본문

개발/문제해결

[백준] 2623번 : 음악 프로그램

hyosupsong 2021. 3. 1. 00:05

문제

www.acmicpc.net/problem/2623

 

2623번: 음악프로그램

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

www.acmicpc.net

문제해결방법

이 문제는 정해진 순서를 지키면서 가수들의 출연 순서를 정하는 문제였고 위상 정렬을 이용해서 풀었다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package baekjoon;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.StringTokenizer;
 
public class Main2623_음악프로그램 {
 
    public static int N, M;
    public static int[] v;
    public static List<Integer>[] list;
    public static Queue<Integer> q = new ArrayDeque<>();
 
    public static void bfs(int index) {
        Queue<Integer> bfsq = new ArrayDeque<>();
        bfsq.add(index);
        q.add(index);
        v[index]--;
        while(!bfsq.isEmpty()) {
            int cur = bfsq.poll();
            for(int i=0; i<list[cur].size(); i++) {
                int next = list[cur].get(i);
                v[next]--;
                if(v[next]==0) {
                    bfsq.add(next);
                    q.add(next);
                    v[next]--;
                }
            }
        }
    }
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        v = new int[N+1];
        list = new List[N+1];
        for(int i=1; i<=N; i++) list[i] = new ArrayList<Integer>();
        for(int i=0; i<M; i++) {
            st = new StringTokenizer(br.readLine());
            int c = Integer.parseInt(st.nextToken());
            int before = Integer.parseInt(st.nextToken());
            for(int j=1; j<c; j++) {
                int cur = Integer.parseInt(st.nextToken());
                v[cur]++;
                list[before].add(cur);
                before = cur;
            }
        }
        for(int j=1; j<=N; j++) {
            if(v[j]==0) {
                bfs(j);
            }
        }
        boolean flag = false;
        for(int j=1; j<v.length; j++) {
            if(v[j]>0) {
                flag = true;
                break;
            }
        }
        if(flag) System.out.println("0");
        else {
            while(!q.isEmpty()) System.out.println(q.poll());
        }
    }
}
cs


코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.