본문 바로가기

ALGORITHM

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

1. 문제 링크

 

2623번: 음악프로그램

첫째 줄에는 가수의 수 N과 보조 PD의 수 M이 주어진다. 가수는 번호 1, 2,…,N 으로 표시한다. 둘째 줄부터 각 보조 PD가 정한 순서들이 한 줄에 하나씩 나온다. 각 줄의 맨 앞에는 보조 PD가 담당한

www.acmicpc.net

 

2. 문제 및 입출력예제

 

3. 문제 풀이

1. PD의 수만큼 ArrayList를 만든다.

2. 입력받은 순서대로 list에 넣으면서 진입차수를 더해준다. 3. 위상정렬을 진행한다.

    3-1. 처음에 진입차수가 0인(선행되는 수가 없는) 숫자를 큐에 넣는다.

    3-2. 큐에서 빼고 결과 list에 추가한다.

    3-3. 그 수와 연결된 숫자들의 진입차수를 하나씩 빼면서 0이 될 때 큐에 넣는다.

4. 위상 정렬이 끝난 후 결과 list에 N개가 전부 들어왔다면 위상정렬이 성공된 것이다.

 

4. 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Queue;

public class Main {
    static int N, in[];
    static ArrayList<Integer>[] list;
    static ArrayList<Integer> result;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        String[] split = br.readLine().split(" ");
        N = Integer.parseInt(split[0]);
        int M = Integer.parseInt(split[1]);

        in = new int[N+1];
        list = new ArrayList[N+1];
        result = new ArrayList<>();

        for(int i=0;i<N+1;i++){
            list[i] = new ArrayList<>();
        }

        for(int i=0;i<M;i++){
            split = br.readLine().split(" ");
            int num = Integer.parseInt(split[0]);
            int first = Integer.parseInt(split[1]);
            for(int j=2;j<num+1;j++){
                int next = Integer.parseInt(split[j]);
                list[first].add(next);
                in[next]++;
                first = next;
            }
        }

        topology(); //위상정렬

        // N개가 위상정렬되었음
        if(result.size() == N){
            for(Integer i: result) {
                sb.append(i).append("\n");
            }
            System.out.println(sb);
        }
        else{
            System.out.println(0);
        }

    }

    private static void topology() {
        Queue<Integer> queue = new ArrayDeque<>();
        for (int i = 1; i < N + 1; i++) {
            if (in[i] == 0) {
                queue.offer(i);
            }
        }

        while (!queue.isEmpty()) {
            int now = queue.poll();
            result.add(now);
            for (Integer i : list[now]) {
                if (--in[i] == 0) {
                    queue.offer(i);
                }
            }
        }
    }
}

 

'ALGORITHM' 카테고리의 다른 글

백준 2831 댄스 파티 (Java)  (0) 2023.09.12
백준 15684 사다리 조작 (Java)  (0) 2023.09.11
백준 14226 이모티콘 (Java)  (0) 2023.09.08
백준 2448 별 찍기 - 11 (Java)  (0) 2023.09.07
백준 1744 수 묶기 (Java)  (0) 2023.09.06