Algorithm/๊ทธ๋ž˜ํ”„(Graph)

[๋ฐฑ์ค€, Java] 2623๋ฒˆ : ์Œ์•…ํ”„๋กœ๊ทธ๋žจ

Zayson 2022. 8. 9. 19:29

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

https://www.acmicpc.net/problem/2623

๐Ÿ˜ฎ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

์œ„์ƒ ์ •๋ ฌ์„ ์ด์šฉํ•ด ์„œ๋กœ์˜ ์ˆœ์„œ๋ฅผ ๊ตฌํ•ด์ค€๋‹ค.

  1. ์ž…๋ ฅ์— ๋Œ€ํ•ด ๊ทธ๋ž˜ํ”„๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  2. ์ž…๋ ฅ์— ๋Œ€ํ•ด ์ˆœ์„œ์— ๋”ฐ๋ผ indegree ๋ฐฐ์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ์นด์šดํŒ…ํ•ด์ค€๋‹ค.
  3. ์œ„์ƒ ์ •๋ ฌ์„ ์ด์šฉํ•ด ์ˆœ์„œ๋ฅผ ๋ฆฌ์ŠคํŠธ์— ๋‹ด์•„์ค€๋‹ค.
    1. ๋ฆฌ์ŠคํŠธ ์‚ฌ์ด์ฆˆ๊ฐ€ N๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ → 0์„ ๋ฐ˜ํ™˜
    2. ๊ทธ ์™ธ ์ˆœ์„œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ด ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿšฉ Java ์ฝ”๋“œ

package com.second.algorithm.baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main_2623_์Œ์•…ํ”„๋กœ๊ทธ๋žจ {
    private static int N, M;
    private static List<List<Integer>> graph;

    public static void main(String[] args) throws IOException {
        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 ArrayList<>();

        int[] indegree = new int[N + 1];
        for (int index = 0; index <= N; index++) {
            graph.add(new ArrayList<>());
        }

        // ์ˆœ์„œ ์ •๋ณด ์ €์žฅ
        for (int pd = 0; pd < M; pd++) {
            st = new StringTokenizer(br.readLine());
            int singerCount = Integer.parseInt(st.nextToken());
            int singer = 0;
            for (int index = 0; index < singerCount; index++) {
                int nextSinger = Integer.parseInt(st.nextToken());

                if (singer != 0) {
                    graph.get(singer).add(nextSinger);
                    indegree[nextSinger]++;
                }
                singer = nextSinger;
            }
        }

        int[] rst = startMusicBank(indegree);
        Arrays.stream(rst).forEach(System.out::println);
        br.close();
    }

    private static int[] startMusicBank(int[] indegree) {
        Queue<Integer> queue = new LinkedList<>();
        for (int singer = 1; singer <= N; singer++) {
            if (indegree[singer] == 0) queue.add(singer);
        }

        List<Integer> orders = new ArrayList<>();

        // ์œ„์ƒ ์ •๋ ฌ ์‹œ์ž‘
        while (!queue.isEmpty()) {
            Integer singer = queue.poll();
            orders.add(singer);
            for (Integer nextSinger : graph.get(singer)) {
                indegree[nextSinger]--;
                if(indegree[nextSinger] == 0) {
                    queue.add(nextSinger);
                }
            }
        }

        if(orders.size() < N) return new int[]{0};  // ๋ชจ๋“  ๊ฐ€์ˆ˜์˜ ์ˆœ์„œ๊ฐ€ ์ •ํ•ด์ง€์ง€ ์•Š์€ ๊ฒฝ์šฐ = size๊ฐ€ N ๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ
        return orders.stream().mapToInt(Integer::intValue).toArray();   // List to Array
    }
}
๋ฐ˜์‘ํ˜•