|
| 1 | +# [2252] 줄 세우기 - JAVA |
| 2 | + |
| 3 | +## 분류 |
| 4 | +> 위상정렬 |
| 5 | +
|
| 6 | +## 코드 |
| 7 | +```java |
| 8 | +import java.io.*; |
| 9 | +import java.util.LinkedList; |
| 10 | +import java.util.Queue; |
| 11 | +import java.util.StringTokenizer; |
| 12 | + |
| 13 | +public class Main { |
| 14 | + public static void main(String[] args) throws IOException { |
| 15 | + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); |
| 16 | + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); |
| 17 | + StringBuilder sb = new StringBuilder(); |
| 18 | + |
| 19 | + StringTokenizer st = new StringTokenizer(br.readLine()); |
| 20 | + int N = Integer.parseInt(st.nextToken()); |
| 21 | + int M = Integer.parseInt(st.nextToken()); |
| 22 | + int[] indegree = new int[N+1]; |
| 23 | + LinkedList<Integer>[] graph = new LinkedList[N+1]; |
| 24 | + for(int i=1; i<=N; i++) |
| 25 | + graph[i] = new LinkedList<>(); |
| 26 | + |
| 27 | + for(int i=0; i<M; i++){ |
| 28 | + st = new StringTokenizer(br.readLine()); |
| 29 | + int u = Integer.parseInt(st.nextToken()); |
| 30 | + int v = Integer.parseInt(st.nextToken()); |
| 31 | + |
| 32 | + graph[u].add(v); |
| 33 | + indegree[v] += 1; |
| 34 | + } |
| 35 | + |
| 36 | + Queue<Integer> queue = new LinkedList<>(); |
| 37 | + for(int i=1; i<=N; i++) { |
| 38 | + if (indegree[i] == 0) |
| 39 | + queue.offer(i); |
| 40 | + } |
| 41 | + |
| 42 | + while(!queue.isEmpty()){ |
| 43 | + int cur = queue.poll(); |
| 44 | + |
| 45 | + sb.append(cur + " "); |
| 46 | + |
| 47 | + for(int next : graph[cur]){ |
| 48 | + indegree[next] -= 1; |
| 49 | + if(indegree[next] == 0) |
| 50 | + queue.offer(next); |
| 51 | + } |
| 52 | + } |
| 53 | + |
| 54 | + bw.write(sb.toString()); |
| 55 | + bw.flush(); |
| 56 | + bw.close(); |
| 57 | + br.close(); |
| 58 | + } |
| 59 | +} |
| 60 | +``` |
| 61 | + |
| 62 | +## 문제풀이 |
| 63 | +위상정렬을 공부한 덕분에 따로 코드를 안 보고 풀 수 있었습니다. |
| 64 | + |
| 65 | +A B 입력을 받을 때 A -> B 방향으로 생각하고 방향 그래프를 만듭니다. |
| 66 | + |
| 67 | +그리고 B의 indegree를 하나 증가시킵니다. |
| 68 | + |
| 69 | +위상정렬을 하기 위해서 indegree가 0인 정점들을 모두 큐에 담습니다. |
| 70 | + |
| 71 | +큐가 빌 때까지 while문을 돕니다. |
| 72 | + - 큐에서 꺼내온 정점은 indegree가 0이므로 출력합니다. |
| 73 | + - 그리고 해당 정점에서 갈 수 있는 다음 정점들의 indegree를 하나씩 감소시킵니다. |
| 74 | + - 다음 정점의 indegree를 1 감소시켜서 indegree가 0이된다면 큐에 넣어서 다음 위상정렬의 대상이 되도록 합니다. |
| 75 | + |
| 76 | +이렇게 위상정렬을 돌면서 출력하면 그게 바로 답입니다. |
| 77 | + |
| 78 | +## 후기 |
| 79 | +위상정렬만 쓴다면 아주 쉽게 풀립니다! |
0 commit comments