Skip to content

Commit ec4b020

Browse files
authored
Merge pull request #102 from banasu0723/main
초급반 / 이승언 / 선수과목-14567, 줄세우기-2252
2 parents 584f7d2 + 5ac1da8 commit ec4b020

2 files changed

Lines changed: 123 additions & 0 deletions

File tree

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package topological_sorting.선수과목.banasu0723;
2+
3+
import java.io.BufferedReader;
4+
import java.io.IOException;
5+
import java.io.InputStreamReader;
6+
import java.util.*;
7+
8+
public class Main {
9+
public static void main(String[] args) throws IOException {
10+
// 입력 준비
11+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
12+
StringTokenizer st = new StringTokenizer(br.readLine());
13+
StringBuilder sb = new StringBuilder();
14+
15+
int N = Integer.parseInt(st.nextToken()); // 과목 수
16+
int M = Integer.parseInt(st.nextToken()); // 선수 조건 수
17+
18+
List<List<Integer>> graph = new ArrayList<>(); // 선수 과목 관계를 담은 인접 리스트
19+
int[] inDegree = new int[N + 1]; // 진입 차수, inDegree[i]: 과목 i의 선수과목 수
20+
int[] semester = new int[N + 1]; // 최소 이수 학기, semester[i]: 과목 i를 이수할 수 있는 최소 학기 수
21+
22+
// 그래프 초기화 및 최소 학기 초기값 설정
23+
for (int i = 0; i <= N; i++) {
24+
graph.add(new ArrayList<>());
25+
semester[i] = 1; // 기본적으로 모든 과목은 1학기부터 수강 가능
26+
}
27+
28+
// 간선 정보 입력 (선수과목 → 후속과목)
29+
for (int i = 0; i < M; i++) {
30+
st = new StringTokenizer(br.readLine());
31+
int A = Integer.parseInt(st.nextToken());
32+
int B = Integer.parseInt(st.nextToken());
33+
graph.get(A).add(B);
34+
inDegree[B]++;
35+
}
36+
37+
// 위상 정렬
38+
Queue<Integer> queue = new LinkedList<>();
39+
40+
// 진입 차수 0인 과목(선수과목이 없는 과목) 먼저 큐에 넣기
41+
for (int i = 1; i <= N; i++) {
42+
if (inDegree[i] == 0) {
43+
queue.add(i);
44+
}
45+
}
46+
47+
// 현재 과목을 듣고 나면 다음 과목의 수강 가능 시점(학기)을 갱신
48+
while (!queue.isEmpty()) {
49+
int current = queue.poll();
50+
51+
for (int next : graph.get(current)) {
52+
inDegree[next]--;
53+
// 다음 과목의 최소 학기 갱신: 이전 과목 + 1
54+
semester[next] = Math.max(semester[next], semester[current] + 1);
55+
// 진입 차수가 0이 되면 큐에 넣어서 계속 탐색
56+
if (inDegree[next] == 0) {
57+
queue.add(next);
58+
}
59+
}
60+
}
61+
62+
// 모든 과목의 최소 수강 학기를 출력
63+
for (int i = 1; i <= N; i++) {
64+
sb.append(semester[i]).append(" ");
65+
}
66+
67+
System.out.println(sb);
68+
}
69+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package topological_sorting.줄세우기.banasu0723;
2+
3+
import java.io.BufferedReader;
4+
import java.io.IOException;
5+
import java.io.InputStreamReader;
6+
import java.util.*;
7+
8+
public class Main {
9+
public static void main(String[] args) throws IOException {
10+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
11+
StringTokenizer st = new StringTokenizer(br.readLine());
12+
StringBuilder sb = new StringBuilder();
13+
int N = Integer.parseInt(st.nextToken()); // 학생 수
14+
int M = Integer.parseInt(st.nextToken()); // 비교 횟수
15+
List<List<Integer>> graph = new ArrayList<>(); // 인접 리스트, graph.get(A)는 A 다음에 와야 하는 학생들의 리스트
16+
int[] inDegree = new int[N + 1]; // 진입 차수, inDegree[i]는 학생 i 앞에 와야 하는 학생 수
17+
// 초기화, 1번 학생부터 N번 학생까지 사용할 수 있도록 인접 리스트 초기화
18+
for (int i = 0; i <= N; i++) {
19+
graph.add(new ArrayList<>());
20+
}
21+
int A, B; // A가 B보다 키가 크다
22+
// 비교 관계를 입력 받아 그래프를 구성하고 진입 차수를 업데이트
23+
for(int i=0; i<M; i++){
24+
st = new StringTokenizer(br.readLine());
25+
A = Integer.parseInt(st.nextToken());
26+
B = Integer.parseInt(st.nextToken());
27+
graph.get(A).add(B); // A가 B 앞에 서야 한다
28+
inDegree[B]++; // B의 진입 차수 증가, B의 앞에 올 학생이 한 명 증가
29+
}
30+
31+
// 진입 차수가 0인 학생(앞에 아무도 없어도 되는 학생들)을 큐에 넣는다
32+
Queue<Integer> queue = new LinkedList<>();
33+
for(int i=1; i<=N; i++){
34+
if(inDegree[i] == 0){ // 진입 차수가 0인 노드
35+
queue.add(i);
36+
}
37+
}
38+
39+
while(!queue.isEmpty()){
40+
int current = queue.poll();
41+
sb.append(current).append("\n"); //현재 줄 세운 학생을 출력
42+
// 현재 학생보다 키가 작은 학생들(현재 학생 다음에 와야 하는 학생들)의 진입 차수를 감소시킨다
43+
for(int next : graph.get(current)){
44+
inDegree[next]--; // 진입 차수 감소
45+
if(inDegree[next] == 0){ // 진입 차수가 0이 되면 큐에 추가
46+
queue.add(next);
47+
}
48+
}
49+
}
50+
51+
System.out.println(sb);
52+
53+
}
54+
}

0 commit comments

Comments
 (0)