2252번: 줄 세우기
첫째 줄에 N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의
www.acmicpc.net
package baekjoon;
import java.util.*;
import java.io.*;
public class b2252 {
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int indegree[] = new int[n+1];
ArrayList<Integer>list[] = new ArrayList[n+1];
for(int i = 1; i <= n ;i++) {
list[i] = new ArrayList<>();
}
for(int i = 0 ; i < m ; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
list[a].add(b);
indegree[b]++;
}
Queue<Integer> q = new LinkedList<>();
for(int i = 1 ; i <= n ; i++) {
if(indegree[i] == 0) {
q.offer(i);
}
}
while(!q.isEmpty()) {
int tmp = q.poll();
bw.write(tmp+" ");
for(int i = 0 ; i < list[tmp].size(); i++) {
int next = list[tmp].get(i);
indegree[next]--;
if(indegree[next] == 0) {
q.offer(next);
}
}
}
bw.close();
}
}
3 2
1 3
2 3
이 입력에서 1번이 3번보다 앞에 서고, 2번이 3번보다 앞에 서야하잖아요
이렇게 되면 그래프를 그릴 수 있는데
위상정렬이라고 방향성은 있는데 사이클은 없어야하는 그래프에서 할 수 있는? 정렬이 있는데 고걸 사용하면 됩니다
위상정렬 Topological Sort (Java) :: 뱀귤 블로그 (tistory.com)
이 선생님 글 보면서 공부했는데
자기를 가리키고 있는 선들의 수를 indegree에 저장한 상태에서
indegree가 0인 노드들을 큐에 넣고
다른 노드들의 indegree를 전부 1씩 빼주면서
또 이때 1 빼면서 0이 된 노드들 큐에 넣어주고
이거 계속 반복해주면 됩니다
'BOJ' 카테고리의 다른 글
[JAVA] 백준 - 1275번 - 커피숍2 (1) | 2023.09.07 |
---|---|
[JAVA]백준 2357번 - 최솟값과 최댓값 (1) | 2023.09.03 |
[JAVA]백준 16724번 - 피리 부는 사나이 (0) | 2023.09.01 |
[JAVA]백준 1038번 - 감소하는 수 (0) | 2023.08.30 |
[JAVA]백준 1355 - 구멍난 케이크 자르기 (0) | 2023.08.29 |
댓글