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

최민길(Gale)·2023년 8월 28일
1

알고리즘

목록 보기
118/172

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

이 문제는 위상 정렬을 이용해서 풀 수 있습니다. 각 보조 PD들이 준 명단끼리 순서가 존재할 때 전체 순서를 구해야 하고 사이클이 존재하지 않기 때문에 위상 정렬을 사용할 수 있습니다. 여기서 주의할 점은 입력받은 순서대로 이전값과 현재값이 연결되기 때문에 값을 입력받을 때 이전값을 기록하면서 현재값 입력이 끝나면 이전값을 현재값으로 변환하는 방식으로 진행하면 됩니다.

다음은 코드입니다.

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

class Main{
    static int N,M;
    static List<Integer>[] graph;
    static int[] map;

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

        graph = new List[N+1];
        for(int i=0;i< graph.length;i++) graph[i] = new ArrayList<>();
        map = new int[N+1];

        for(int i=1;i<=M;i++){
            st = new StringTokenizer(br.readLine());
            int n = Integer.parseInt(st.nextToken());
            int before = Integer.parseInt(st.nextToken());
            for(int j=1;j<n;j++){
                int curr = Integer.parseInt(st.nextToken());
                graph[before].add(curr);
                map[curr]++;
                before = curr;
            }
        }

        List<Integer> res = new ArrayList<>();
        Queue<Integer> queue = new ArrayDeque<>();
        for(int i=1;i<=N;i++) if(map[i]==0) queue.add(i);

        while(!queue.isEmpty()){
            int curr = queue.poll();
            res.add(curr);
            for(int next : graph[curr]){
                map[next]--;
                if(map[next]==0) queue.add(next);
            }
        }

        if(res.size()!=N) System.out.println("0\n");

        StringBuilder sb = new StringBuilder();
        for(int i=0;i<res.size();i++) sb.append(res.get(i)).append("\n");
        System.out.println(sb);
    }
}

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글

관련 채용 정보