baekjoon/Data_Structure
백준 1766번 : 문제집 [자바]
Meluu_
2025. 6. 24. 08:35
🧫 문제 분석
✔️ 출처
📖 문제

위상정렬 + 우선순위 큐 문제
먼저 푸는게 좋은 문제들은
위상정렬로 진입차수를 저장해준다.
a b 로 a가 먼저 푸는게 좋은 문제면
b의 진입차수 1을 늘려준다.
그리고 진입차수가 0인 문제들을 전부 우선순위 큐에 저장하고
하나씩 꺼내서 문제를 푼다. (우선순위 큐 기본 정렬을 사용했으므로 오름차순 정렬되어 난이도가 낮은 순으로 나온다.)
풀고 해당 문제가 먼저 푸는게 좋은 문제였다면
연결되어있는 뒤 문제들의 진입차수를 -1 해준다.
이때 연결된 문제들의 진입차수가 0이 되었다면 더이상 먼저 푸는게 좋은 문제는 존재하지 않으므로
해당 문제도 우선순위 큐에 저장한다.
🔅 문제 풀이
import java.io.*;
import java.util.*;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
List<Integer>[] graph = new List[N + 1];
for (int i = 1; i <= N; i++) {
graph[i] = new ArrayList<>();
}
int[] topology = new int[N + 1];
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);
topology[b]++; // 진입차수 증가
}
PriorityQueue<Integer> pq = new PriorityQueue<>();
StringBuilder sb = new StringBuilder();
// 진입차수가 0인 먼저 풀거나, 그냥 풀어도되는 문제들 저장
for (int i = 1; i <= N; i++) {
if (topology[i] == 0) {
pq.add(i);
}
}
// 쉬운 문제들 부터 꺼내서 풀이
while (!pq.isEmpty()) {
int num = pq.poll();
sb.append(num).append(" ");
// 현재 푼 문제가 먼저 풀어야 좋은 문제였으면 풀렸음을 표시한다.
for (int problem : graph[num]) {
topology[problem]--;
// 먼저 풀어야 좋은 문제가 더이상 없다면 해당 문제도 우선순위큐에 삽입
if (topology[problem] == 0) {
pq.add(problem);
}
}
}
System.out.println(sb.toString());
}
}