문제 풀이 및 개발 공간

[백준] 2623번 음악프로그램 (gold 3 본문

백준공부/java

[백준] 2623번 음악프로그램 (gold 3

gomduri43 2024. 3. 15. 14:10

import java.util.*;
import java.io.*;

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));

        StringTokenizer st=new StringTokenizer(br.readLine());
        int n=Integer.valueOf(st.nextToken());
        int m=Integer.valueOf(st.nextToken());

        //연결 관계 파악 위한 리스트
        ArrayList<Integer>[] arr=new ArrayList[n+1];
        for(int i=1; i<=n; i++){
            arr[i]=new ArrayList<>();
        }

        //연결관계 및 차수 파악
        int[] v=new int[n+1];
        for(int i=0; i<m; i++){
            st=new StringTokenizer(br.readLine());
            int t=Integer.valueOf(st.nextToken());
            int temp=Integer.valueOf(st.nextToken());
            for(int j=1; j<t; j++){
                int num=Integer.valueOf(st.nextToken());
                v[num]++;
                arr[temp].add(num);
                temp=num;
            }
        }

        Queue<Integer> que=new LinkedList<>();
        //차수 0부터 넣기
        for(int i=1; i<=n; i++){
            if(v[i]==0){
                que.offer(i);
            }
        }

        //차수 0부터 넣으면서 해당 정점들 차수 깎으면서 0이면 추가.
        //list에 순서대로 넣기
        ArrayList<Integer> list=new ArrayList<>();
        while(!que.isEmpty()){
            int temp=que.poll();
            list.add(temp);
            for(int i=0; i<arr[temp].size(); i++){
                int t=arr[temp].get(i);
                v[t]--;
                if(v[t]==0){
                    que.offer(t);
                }
            }
        }

        //list의 사이즈가 n이면 모든 정점 들어온거 즉 순서대로 나열가능
        //사이즈가 다르면 못 들어오는 경우가 있는거 한마디로 불가.
        if(list.size()==n){
            for(Integer e : list){
                bw.write(e+"\n");
            }
        }
        else{
            bw.write("0");
        }
        bw.flush();
    }
}