문제풀이/백준
[백준]2623: 음악프로그램 - JAVA
빈둥벤둥
2021. 7. 24. 21:45
[백준]2623: 음악프로그램
2623번: 음악프로그램
첫째 줄에는 가수의 수 N과 보조 PD의 수 M이 주어진다. 가수는 번호 1, 2,…,N 으로 표시한다. 둘째 줄부터 각 보조 PD가 정한 순서들이 한 줄에 하나씩 나온다. 각 줄의 맨 앞에는 보조 PD가 담당한
www.acmicpc.net
풀이
🪑 우선순위를 위배하지 않는 순서를 결정하는 문제! 위상정렬 문제이다.
📝 문제의 조건을 정리해 보자.
- 각각의 피디가 가져온 모든 우선순위를 만족하는 순서를 구해야 한다.
- 불가능할 경우 0을 출력한다.
🔧 구현 과정을 정리해 보자!
- 정보를 입력받으며 진출간선 정보, 진입 간선의 수를 저장해 준다.
- 위상 정렬을 하며 우선순위를 위반하지 않는 정렬 순서를 구한다.
- 가능한 경우 구한 순서를 출력하고, 불가능한 경우 0을 출력한다.
🔹 진출간선 정보, 진입 간선의 수를 저장해 준다.
- 위상정렬 알고리즘을 사용하기 위해 필요한 정보들이다.
- 진출간선 정보는 N번째 다음으로 올 수 있는 가수의 정보를 의미한다.
- 진입 간선의 수는 N번 가수 이전에 와야하는 가수의 수를 의미한다.
🔹 위상 정렬로 정렬 순서를 구한다.
- 진입 간선의 수가 0인 가수를 차례대로 Queue에 담아준다.
- Queue에 담아주었으므로 해당 가수 다음으로 올 수 있는 가수들을 탐색하며 해당 가수들의 진입 간선의 수를 하나 줄여준다.
- 진입 간선의 수가 0이되는 가수가 있다면 Queue에 담아준다.
🔹 가능한 경우 구한 순서를 출력하고, 불가능한 경우 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
|
import java.util.*;
public class Main {
static ArrayList<Integer>[] list;
static int[] indegree;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//입력
int n = scan.nextInt();
int m = scan.nextInt();
list = new ArrayList[n + 1];
for(int i = 1; i <= n; i++) {
list[i] = new ArrayList<>();
}
indegree = new int[n + 1];
for(int i = 0; i < m; i++) {
int count = scan.nextInt();
if(count == 0) continue;
int s = scan.nextInt();
for(int j = 0; j < count - 1; j++) {
int e = scan.nextInt();
indegree[e]++;
list[s].add(e);
s = e;
}
}
//입력 끝
ArrayList<Integer> result = topologySort(n);
if(result.size() == n) {
for(int i = 0; i < result.size(); i++) {
System.out.println(result.get(i));
}
} else {
System.out.println("0");
}
}
public static ArrayList<Integer> topologySort(int n) {
Queue<Integer> q = new LinkedList<>();
for(int i = 1; i <= n; i++) {
if(indegree[i] == 0) {
q.offer(i);
}
}
ArrayList<Integer> result = new ArrayList<>();
while(!q.isEmpty()) {
int current = q.poll();
result.add(current);
for(int i = 0; i < list[current].size(); i++) {
int next = list[current].get(i);
indegree[next]--;
if(indegree[next] == 0) q.offer(next);
}
}
return result;
}
}
|
cs |