Algorithm/๊ทธ๋ํ(Graph)
[๋ฐฑ์ค, Java] 2623๋ฒ : ์์ ํ๋ก๊ทธ๋จ
Zayson
2022. 8. 9. 19:29
๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/2623
๐ฎ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
์์ ์ ๋ ฌ์ ์ด์ฉํด ์๋ก์ ์์๋ฅผ ๊ตฌํด์ค๋ค.
- ์ ๋ ฅ์ ๋ํด ๊ทธ๋ํ๋ฅผ ์์ฑํ๋ค.
- ์ ๋ ฅ์ ๋ํด ์์์ ๋ฐ๋ผ indegree ๋ฐฐ์ด์ ๊ฐ์๋ฅผ ์นด์ดํ ํด์ค๋ค.
- ์์ ์ ๋ ฌ์ ์ด์ฉํด ์์๋ฅผ ๋ฆฌ์คํธ์ ๋ด์์ค๋ค.
- ๋ฆฌ์คํธ ์ฌ์ด์ฆ๊ฐ N๋ณด๋ค ์์ ๊ฒฝ์ฐ ์์๋ฅผ ๋ณด์ฅํ ์ ์๋ ๊ฒฝ์ฐ → 0์ ๋ฐํ
- ๊ทธ ์ธ ์์ ๋ฆฌ์คํธ๋ฅผ ๋ฐํํด ์ถ๋ ฅํ๋ค.
๐ฉ 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
}
}
๋ฐ์ํ