Skip to content

Commit df7ffd2

Browse files
committed
nsun9505 solved BOJ2252
1 parent fc82f60 commit df7ffd2

File tree

2 files changed

+131
-0
lines changed

2 files changed

+131
-0
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import java.io.*;
2+
import java.util.LinkedList;
3+
import java.util.Queue;
4+
import java.util.StringTokenizer;
5+
6+
public class Main {
7+
public static void main(String[] args) throws IOException {
8+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
9+
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
10+
StringBuilder sb = new StringBuilder();
11+
12+
StringTokenizer st = new StringTokenizer(br.readLine());
13+
int N = Integer.parseInt(st.nextToken());
14+
int M = Integer.parseInt(st.nextToken());
15+
int[] indegree = new int[N+1];
16+
LinkedList<Integer>[] graph = new LinkedList[N+1];
17+
for(int i=1; i<=N; i++)
18+
graph[i] = new LinkedList<>();
19+
20+
for(int i=0; i<M; i++){
21+
st = new StringTokenizer(br.readLine());
22+
int u = Integer.parseInt(st.nextToken());
23+
int v = Integer.parseInt(st.nextToken());
24+
25+
graph[u].add(v);
26+
indegree[v] += 1;
27+
}
28+
29+
Queue<Integer> queue = new LinkedList<>();
30+
for(int i=1; i<=N; i++) {
31+
if (indegree[i] == 0)
32+
queue.offer(i);
33+
}
34+
35+
while(!queue.isEmpty()){
36+
int cur = queue.poll();
37+
38+
sb.append(cur + " ");
39+
40+
for(int next : graph[cur]){
41+
indegree[next] -= 1;
42+
if(indegree[next] == 0)
43+
queue.offer(next);
44+
}
45+
}
46+
47+
bw.write(sb.toString());
48+
bw.flush();
49+
bw.close();
50+
br.close();
51+
}
52+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
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

Comments
 (0)