728x90
⬛ 백준 14567번. 선수과목 (Prerequisite) - 위상정렬 + 레벨 탐색
https://www.acmicpc.net/problem/14567
문제
올해 Z대학 컴퓨터공학부에 새로 입학한 민욱이는 학부에 개설된 모든 전공과목을 듣고 졸업하려는 원대한 목표를 세웠다. 어떤 과목들은 선수과목이 있어 해당되는 모든 과목을 먼저 이수해야만 해당 과목을 이수할 수 있게 되어 있다. 공학인증을 포기할 수 없는 불쌍한 민욱이는 선수과목 조건을 반드시 지켜야만 한다. 민욱이는 선수과목 조건을 지킬 경우 각각의 전공과목을 언제 이수할 수 있는지 궁금해졌다. 계산을 편리하게 하기 위해 아래와 같이 조건을 간소화하여 계산하기로 하였다.
- 한 학기에 들을 수 있는 과목 수에는 제한이 없다.
- 모든 과목은 매 학기 항상 개설된다.
모든 과목에 대해 각 과목을 이수하려면 최소 몇 학기가 걸리는지 계산하는 프로그램을 작성하여라.
입력
첫 번째 줄에 과목의 수 N(1 ≤ N ≤ 1000)과 선수 조건의 수 M(0 ≤ M ≤ 500000)이 주어진다. 선수과목 조건은 M개의 줄에 걸쳐 한 줄에 정수 A B 형태로 주어진다. A번 과목이 B번 과목의 선수과목이다. A < B인 입력만 주어진다. (1 ≤ A < B ≤ N)
출력
1번 과목부터 N번 과목까지 차례대로 최소 몇 학기에 이수할 수 있는지를 한 줄에 공백으로 구분하여 출력한다.
💚나의 풀이
- 기본적으로 선수 조건대로 위상정렬을 할 건데, 출력을 보게 되면 처음 진입차수가 0이었던 정점이 1이 된 것을 보고 레벨 탐색도 함께 사용해야 한다고 생각했다.
- 똑같이 진입차수 0인 애들을 큐에 우선 담는다.
- 해당 큐에 존재하는 애들을 for문으로 순회하며 얘네들의 lv을 똑같이 담으며 처리하는 식
package to_0824_1;
import java.util.*;
/*14567번. 선수 과목 - 위상정렬 + 레벨 탐색 */
public class Main {
static int N, M;
static int[] indegree;
static int[] dy;
static ArrayList<ArrayList<Integer>> graph;
//실행 메인
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner kb= new Scanner(System.in);
N = kb.nextInt();
M = kb.nextInt();
indegree = new int[N+1];
dy = new int[N+1];
graph = new ArrayList<>();
for(int i=0; i<=N; i++) {
graph.add(new ArrayList<>());
}
//데이터 입력
for(int i=0; i<M; i++) {
int a = kb.nextInt();
int b = kb.nextInt();
//a -> b 순으로 수강
graph.get(a).add(b);
indegree[b]++;//진입차수 ++
}
int lv = 0;
Queue<Integer> Q = new LinkedList<>();
//진입차수 0 인애 싹 담기
for(int i=1; i<=N; i++) {
if(indegree[i] == 0) {
Q.offer(i);
}
}
while(!Q.isEmpty()) {
//레벨 탐색할 거라
lv++;
int len = Q.size();
for(int i=0; i<len ;i++) {//하나의 레벨에 대하여
int cur = Q.poll();
dy[cur] = lv;//담기
for(int nx : graph.get(cur)) {//뽑은 현재 과목 다음 과목 처리
indegree[nx]--;
if(indegree[nx] == 0) Q.offer(nx);
}
}
}
//정답 출력
for(int i=1; i<=N; i++) {
System.out.print(dy[i] + " ");
}
}
}
728x90
'코딩 테스트 [준비] > [문풀] Baekjoon_백준 문풀_조지기' 카테고리의 다른 글
백준 | 1948번. 임계경로 - 위상정렬 & 다익스트라 (0) | 2023.08.25 |
---|---|
백준 | 2623번. 음악프로그램 - 위상정렬 (0) | 2023.08.24 |
백준 | 1766번. 문제집 - 위상정렬 & 우선순위 큐 (0) | 2023.08.23 |
백준 | 1516번. 게임 개발 - 위상정렬 & DP (0) | 2023.08.23 |
백준 | 2056번. 작업 - 위상 정렬 & DP (0) | 2023.08.23 |