728x90
문제
올해 Z대학 컴퓨터공학부에 새로 입학한 민욱이는 학부에 개설된 모든 전공과목을 듣고 졸업하려는 원대한 목표를 세웠다. 어떤 과목들은 선수과목이 있어 해당되는 모든 과목을 먼저 이수해야만 해당 과목을 이수할 수 있게 되어 있다. 공학인증을 포기할 수 없는 불쌍한 민욱이는 선수과목 조건을 반드시 지켜야만 한다. 민욱이는 선수과목 조건을 지킬 경우 각각의 전공과목을 언제 이수할 수 있는지 궁금해졌다. 계산을 편리하게 하기 위해 아래와 같이 조건을 간소화하여 계산하기로 하였다.
- 한 학기에 들을 수 있는 과목 수에는 제한이 없다.
- 모든 과목은 매 학기 항상 개설된다.
모든 과목에 대해 각 과목을 이수하려면 최소 몇 학기가 걸리는지 계산하는 프로그램을 작성하여라.
입력
첫 번째 줄에 과목의 수 N(1 ≤ N ≤ 1000)과 선수 조건의 수 M(0 ≤ M ≤ 500000)이 주어진다. 선수과목 조건은 M개의 줄에 걸쳐 한 줄에 정수 A B 형태로 주어진다. A번 과목이 B번 과목의 선수과목이다. A < B인 입력만 주어진다. (1 ≤ A < B ≤ N)
출력
1번 과목부터 N번 과목까지 차례대로 최소 몇 학기에 이수할 수 있는지를 한 줄에 공백으로 구분하여 출력한다.
해결 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
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());
int[] prerequisites = new int[N+1];
List<Integer>graph[] = new ArrayList[N+1];
for(int i=0;i<=N;i++){
graph[i] = new ArrayList<>();
}
//위상 정렬 그래프 생생성
//선수과목 -> 후속과목으로 노드 연결
for(int i=0;i<M;i++){
st = new StringTokenizer(br.readLine());
int from = Integer.parseInt(st.nextToken());
int to = Integer.parseInt(st.nextToken());
prerequisites[to]++;
graph[from].add(to);
}
PriorityQueue<Subject> pq = new PriorityQueue<>((a,b)->(a.time - b.time));
int[] time = new int[N+1];
//선수과목이 없는 과목 탐색
for(int i=1;i<=N;i++){
if(prerequisites[i] == 0){
pq.add(new Subject(i,1));
}
}
//더이상 들을 선수과목이 없는 과목 탐색하여 시간 구하기
while(!pq.isEmpty()){
Subject curr = pq.poll();
if(prerequisites[curr.no] == 0){
time[curr.no] = curr.time;
}
for(int next : graph[curr.no]){
prerequisites[next]--;
if(prerequisites[next] == 0){
pq.add(new Subject(next,curr.time+1));
}
}
}
StringBuilder sb = new StringBuilder();
//시간 출력
for(int i=1;i<=N;i++){
sb.append(time[i]+" ");
}
sb.deleteCharAt(sb.length()-1);
System.out.println(sb);
}
}
class Subject {
int no;
int time;
public Subject(int no,int time){
this.no = no;
this.time = time;
}
}
실행 결과
팁
- 그래프와 순서가 나오면 위상정렬을 생각해보자
'알고리즘 문제 풀이 > 해결코드' 카테고리의 다른 글
[백준 - 2141][GOLD 4][해설 X] - 우체국 (JAVA) (0) | 2024.04.30 |
---|---|
[백준 - 1240][GOLD 5][해설 X] - 노드사이의 거리 (JAVA) (1) | 2024.04.26 |
[백준 - 2109][GOLD 3][해설 X] - 순회강연 (JAVA) (0) | 2024.04.24 |
[백준 - 13164][GOLD 5][해설 X] - 행복 유치원 (JAVA) (0) | 2024.04.23 |
[백준 - 12869][GOLD 4][해설 X] - 뮤탈리스크 (JAVA) (0) | 2024.04.22 |