문제
1766번: 문제집
첫째 줄에 문제의 수 N(1 ≤ N ≤ 32,000)과 먼저 푸는 것이 좋은 문제에 대한 정보의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 둘째 줄부터 M개의 줄에 걸쳐 두 정수의 순서쌍 A,B가 빈칸을 사이에 두고 주
www.acmicpc.net
알고리즘
위상 정렬, 우선순위 큐
풀이
먼저 푸는 것이 좋은 문제는 반드시 먼저 풀어야한다는 조건이 있다.
즉 문제 사이에 순서가 있으므로 위상 정렬을 사용한다.
또한 각 문제는 쉬운 문제(번호가 작은 문제)부터 풀어야하므로 우선순위 큐를 사용하여 정렬을 유지하면서
큐에서 삭제되는 순서대로 값을 출력하면 된다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
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>[] graph = new ArrayList[N+1];
for (int i = 1; i <= N; i++)
graph[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());
graph[A].add(B);
inDegree[B]++;
}
PriorityQueue<Integer> pq = new PriorityQueue<>((p1, p2) -> p1-p2);
for(int i=1; i<=N; i++) {
if(inDegree[i] ==0) {
pq.add(i);
}
}
while(!pq.isEmpty()) {
int cur = pq.poll();
sb.append(cur).append(" ");
for(int next: graph[cur]) {
if(--inDegree[next] == 0) {
pq.add(next);
}
}
}
System.out.println(sb);
}
}
'Algorithm > 백준(BOJ)' 카테고리의 다른 글
[백준] 18869. 멀티버스 Ⅱ (Java) (0) | 2022.10.01 |
---|---|
[백준] 2533. 사회망 서비스(SNS) (Java) (0) | 2022.10.01 |
[백준] 1600. 말이 되고픈 원숭이 (Java) (1) | 2022.09.30 |
[백준] 1507. 궁금한 민호 (Java) (1) | 2022.09.30 |
[백준] 23258. 밤편지 (Java) (0) | 2022.09.30 |