코딩문제풀이/Baekjoon
[Java] 백준 2623번 : 음악프로그램
코딩하는 포메라니안
2022. 11. 8. 20:43
1. 문제
https://www.acmicpc.net/problem/2623
2623번: 음악프로그램
첫째 줄에는 가수의 수 N과 보조 PD의 수 M이 주어진다. 가수는 번호 1, 2,…,N 으로 표시한다. 둘째 줄부터 각 보조 PD가 정한 순서들이 한 줄에 하나씩 나온다. 각 줄의 맨 앞에는 보조 PD가 담당한
www.acmicpc.net
2. 풀이 과정
1. 순서 찾기 : 위상정렬
2. 정렬이 안 되는 경우는 자신 앞에 있는 노드 수가 0이상인 노드만 남았을 때이다. 이 경우, 사이클이기 때문에 주어진 조건을 모두 만족하는 순서를 찾을 수 없다.
import java.io.*;
import java.util.*;
public class boj2623 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());//가수 수
int M = Integer.parseInt(st.nextToken());//PD수
LinkedList<Integer> back[] = new LinkedList[N+1];
int front[] = new int[N+1];
//init
for(int i=1; i<=N; i++) {
back[i] = new LinkedList<>();
}
//data setting
for(int i=0; i<M; i++) {
st = new StringTokenizer(br.readLine());
int cnt = Integer.parseInt(st.nextToken());
int s = Integer.parseInt(st.nextToken()), e;
for(int j=1; j<cnt; j++) {
e = Integer.parseInt(st.nextToken());
back[s].add(e);
front[e]++;
s = e;
}
}
StringBuilder sb = new StringBuilder();
Queue<Integer> q = new LinkedList<>();
for(int i=1; i<=N; i++) {
if(front[i]==0) {
q.add(i);
}
}
//algorithm
int result = N;
while(!q.isEmpty()) {
int su = q.poll();
result--;
sb.append(su+"\n");
for(int next : back[su]) {
if(--front[next]==0) {
q.add(next);
}
}
}
//result
System.out.println((result > 0) ? "0" : sb.toString());
}
}
결과