Skip to content

Commit ca20edf

Browse files
committed
[Gold III] Title: 음악프로그램, Time: 240 ms, Memory: 16684 KB -BaekjoonHub
1 parent ba0f4a6 commit ca20edf

File tree

2 files changed

+120
-0
lines changed

2 files changed

+120
-0
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# [Gold III] 음악프로그램 - 2623
2+
3+
[문제 링크](https://www.acmicpc.net/problem/2623)
4+
5+
### 성능 요약
6+
7+
메모리: 16684 KB, 시간: 240 ms
8+
9+
### 분류
10+
11+
방향 비순환 그래프, 그래프 이론, 위상 정렬
12+
13+
### 제출 일자
14+
15+
2024년 2월 14일 21:58:35
16+
17+
### 문제 설명
18+
19+
<p>인터넷 방송 KOI(Korea Open Internet)의 음악 프로그램 PD인 남일이는 자기가 맡은 프로그램 '뮤직 KOI'에서 가수의 출연 순서를 정하는 일을 매우 골치 아파한다. 순서를 정하기 위해서는 많은 조건을 따져야 한다.</p>
20+
21+
<p>그래서 오늘 출연 예정인 여섯 팀의 가수에 대해서 남일이가 보조 PD 세 명에게 각자 담당한 가수의 출연 순서를 정해오게 하였다. 보조 PD들이 가져온 것은 아래와 같다.</p>
22+
23+
<ul>
24+
<li>1 4 3</li>
25+
<li>6 2 5 4</li>
26+
<li>2 3</li>
27+
</ul>
28+
29+
<p>첫 번째 보조 PD는 1번 가수가 먼저, 다음에 4번 가수, 다음에 3번 가수가 출연하기로 순서를 정했다. 두 번째 보조 PD는 6번, 2번, 5번, 4번 순으로 자기 담당 가수들의 순서를 정했다. 한 가수를 여러 보조 PD가 담당할 수도 있다. 마지막으로, 세 번째 보조 PD는 2번 먼저, 다음에 3번으로 정했다.</p>
30+
31+
<p>남일이가 할 일은 이 순서들을 모아서 전체 가수의 순서를 정하는 것이다. 남일이는 잠시 생각을 하더니 6 2 1 5 4 3으로 순서를 정했다. 이렇게 가수 순서를 정하면 세 보조 PD가 정해온 순서를 모두 만족한다. 물론, 1 6 2 5 4 3으로 전체 순서를 정해도 괜찮다.</p>
32+
33+
<p>경우에 따라서 남일이가 모두를 만족하는 순서를 정하는 것이 불가능할 수도 있다. 예를 들어, 세 번째 보조 PD가 순서를 2 3 대신에 3 2로 정해오면 남일이가 전체 순서를 정하는 것이 불가능하다. 이번에 남일이는 우리 나라의 월드컵 4강 진출 기념 음악제의 PD를 맡게 되었는데, 출연 가수가 아주 많다. 이제 여러분이 해야 할 일은 보조 PD들이 가져 온 순서들을 보고 남일이가 가수 출연 순서를 정할 수 있도록 도와 주는 일이다.</p>
34+
35+
<p>보조 PD들이 만든 순서들이 입력으로 주어질 때, 전체 가수의 순서를 정하는 프로그램을 작성하시오.</p>
36+
37+
### 입력
38+
39+
<p>첫째 줄에는 가수의 수 N과 보조 PD의 수 M이 주어진다. 가수는 번호 1, 2,…,N 으로 표시한다. 둘째 줄부터 각 보조 PD가 정한 순서들이 한 줄에 하나씩 나온다. 각 줄의 맨 앞에는 보조 PD가 담당한 가수의 수가 나오고, 그 뒤로는 그 가수들의 순서가 나온다. N은 1이상 1,000이하의 정수이고, M은 1이상 100이하의 정수이다.</p>
40+
41+
### 출력
42+
43+
<p>출력은 N 개의 줄로 이뤄지며, 한 줄에 하나의 번호를 출력한 다. 이들은 남일이가 정한 가수들의 출연 순서를 나타낸다. 답이 여럿일 경우에는 아무거나 하나를 출력 한다. 만약 남일이가 순서를 정하는 것이 불가능할 경우에는 첫째 줄에 0을 출력한다.</p>
44+
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import java.io.BufferedReader;
2+
import java.io.BufferedWriter;
3+
import java.io.InputStreamReader;
4+
import java.io.OutputStreamWriter;
5+
import java.util.ArrayDeque;
6+
import java.util.ArrayList;
7+
import java.util.Arrays;
8+
import java.util.StringTokenizer;
9+
10+
public class Main {
11+
12+
static int n, m, cnt;
13+
static int[] p; // 진입차수
14+
static ArrayList<Integer>[] list;
15+
public static void main(String[] args) throws Exception{
16+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
17+
StringBuilder sb = new StringBuilder();
18+
StringTokenizer st = new StringTokenizer(br.readLine());
19+
20+
n = Integer.parseInt(st.nextToken());
21+
m = Integer.parseInt(st.nextToken());
22+
23+
list = new ArrayList[m];
24+
p = new int[n + 1];
25+
for (int i = 0; i < m; i++) {
26+
list[i] = new ArrayList<>();
27+
}
28+
29+
int size, now, next;
30+
for (int i = 0; i < m; i++) {
31+
st = new StringTokenizer(br.readLine());
32+
size = Integer.parseInt(st.nextToken());
33+
for (int j = 0; j < size; j++) {
34+
now = Integer.parseInt(st.nextToken());
35+
list[i].add(now);
36+
p[now] += j;
37+
}
38+
}
39+
40+
ArrayDeque<Integer> q = new ArrayDeque<>();
41+
for (int i = 1; i < n + 1; i++) {
42+
if(p[i] == 0) {
43+
p[i]--;
44+
q.add(i);
45+
sb.append(i + "\n");
46+
}
47+
}
48+
49+
boolean flag;
50+
while(!q.isEmpty()){
51+
now = q.poll();
52+
cnt++;
53+
for (int i = 0; i < m; i++) {
54+
size = list[i].size();
55+
flag = false;
56+
for (int j = 0; j < size; j++) {
57+
next = list[i].get(j);
58+
59+
if(next == now) flag = true;
60+
else if(flag) {
61+
p[next]--;
62+
if (p[next] == 0) {
63+
p[next] = -1;
64+
65+
q.add(next);
66+
sb.append(next + "\n");
67+
}
68+
}
69+
}
70+
}
71+
}
72+
73+
if(cnt == n) System.out.println(sb);
74+
else System.out.println(0);
75+
}
76+
}

0 commit comments

Comments
 (0)