아무코딩

[백준 2623] 음악프로그램 (java) 본문

알고리즘/백준

[백준 2623] 음악프로그램 (java)

동 코 2020. 5. 18. 16:19

문제풀이

 위상정렬을 활용한다. 이 문제에서는 위상정렬이 성립되지 않는 경우를 생각해야된다.

 

위상정렬이 이루어지는 조건은 노드가 다 출력될때까지 in-degree가 0이 아닌 노드가 없는 것인데 그거 말고 이상한 방법으로 사이클 체크를 하려해서 고생을 했다.

 

개념에 충실하자...

 

추가로 위상정렬을 간략하게 설명하자면

indegree가 0인 노드를 큐에다 추가하는 방식

프린트는 물론 큐에서 하나씩.

그러면 순서가 보장된다.

소스코드

더보기
 
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
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Baekjoon2623 {
    static int N;
    static int M;
    static ArrayList<Integer>[] graph;
    static int[] countOfInDegree;
    static Queue<Integer> queue;
    static ArrayList<Integer> result = new ArrayList<>();
    public static void main(String[] args) throws IOException {
        Scanner scan = new Scanner(System.in);
        N = scan.nextInt();
        M = scan.nextInt();
        graph = new ArrayList[N+1];
        countOfInDegree = new int[N+1]; //초기값 0이라서 int배열
        queue = new LinkedList<>();
        initGraph(scan);
        for(int i=1;i<=N;i++){
            if(countOfInDegree[i]==0)
                queue.add(i);
        }
        if(queue.isEmpty()){
            System.out.println(0);
            return;
        }
        arrangeOrder();
        if(result.size()!=N)
            System.out.println(0);
        else {
            for (int num : result) {
                System.out.println(num);
            }
        }
    }
    public static void arrangeOrder() {
        while(!queue.isEmpty()){
            int node = queue.poll();
            result.add(node);
            for(int i=0;i<graph[node].size();i++){
                countOfInDegree[graph[node].get(i)]--;
                if(countOfInDegree[graph[node].get(i)]==0){
                    queue.add(graph[node].get(i));
                }
            }
            graph[node].clear();
        }
    }
    public static void initGraph(Scanner scan) {
        for(int i=1;i<=N;i++){
            graph[i] = new ArrayList<>();
        }
        for(int i=0;i<M;i++){
            int num = scan.nextInt();
            int from = scan.nextInt();
            int to =0;
            for(int j=1;j<num;j++){
                to = scan.nextInt();
                graph[from].add(to);
                countOfInDegree[to]++;
                from = to;
            }
        }
    }
}
 
cs

문제 링크 : https://www.acmicpc.net/problem/2623

 

2623번: 음악프로그램

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

www.acmicpc.net

 

'알고리즘 > 백준' 카테고리의 다른 글

[백준 2931] 가스관(java)  (0) 2020.05.20
[백준 17070] 파이프 옮기기1 (java)  (0) 2020.05.19
[백준 2352] 반도체 설계  (0) 2020.05.15
[백준 17281] 야구  (0) 2020.05.12
[백준 2580] 스도쿠  (0) 2020.05.11
Comments