https://www.acmicpc.net/problem/2623
접근법
기본적인 위상정렬문제로 쉽게 해결!
위상정렬의 핵심은 inDegree 배열. 각 인덱스별로 앞서 필요한 항목의 수 만큼 count를 가지고 있고, 조치가 취해지면 count를 깍아나가는 식으로 접근하면 됨
graph는 선행 -> 후행의 관계를 잡기위해 마련한 변수.
- 입력에 따라 선행, 후행 관계를 graph 배열의 인덱스에 맞게 생성.
- 생성하면서 후행이 되는 인덱스는 inDegree 배열 값도 올려줌
- 초기에는 inDegree배열이 0인 값 = 선행조건이 없는 값을 Queue에 넣어주고 반복문
소스
import java.util.*;
import java.io.*;
public class Main {
static int N; // 가수 수
static int M; // 보조 PD 수
static int[] inDegree; // 위상정렬 행렬
static Node[] graph; // 링크관계를 담는 행렬
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
inDegree = new int[N+1];
graph = new Node[N+1];
for(int i = 1; i < graph.length; i++) {
graph[i] = new Node(i);
}
for(int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int lineCnt = Integer.parseInt(st.nextToken());
int[] tempArr = new int [lineCnt];
for(int j = 0; j < lineCnt; j++) {
tempArr[j] = Integer.parseInt(st.nextToken());
}
for(int j = 0; j < lineCnt-1; j++) {
graph[tempArr[j]].link.add(tempArr[j+1]); //지금 인덱스의 graph에 다음 인덱스를 링크로 연결
inDegree[tempArr[j+1]]++; //다음 인덱스는 값을 증가시킴
}
}
topologicalSort();
}
static void topologicalSort() {
ArrayList<Integer> answer = new ArrayList<Integer>();
Queue<Integer> q = new LinkedList<Integer>();
for(int i = 1; i < inDegree.length; i++) {
if(inDegree[i] == 0) q.offer(i);
}
while(!q.isEmpty()) {
int cur = q.poll();
answer.add(cur); // 출력 리스트에 넣어주고
// 해당 노드에 연결된 항목들을 조사해서 inDegree깍아주고, 0이면 q에 offer
for(int i = 0; i < graph[cur].link.size(); i++) {
int link = graph[cur].link.get(i);
inDegree[link]--;
if(inDegree[link] == 0) q.offer(link);
}
}
if(answer.size() != N) {
System.out.println("0");
return;
}
for(int i = 0; i < answer.size(); i++) System.out.println(answer.get(i));
}
}
class Node{
int index;
ArrayList<Integer> link;
Node(int index){
this.index = index;
link = new ArrayList<Integer>();
}
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 - 11048번 이동하기 - java (0) | 2023.08.08 |
---|---|
백준 - 11779번 최소비용 구하기 2 - java (0) | 2023.08.06 |
백준 - 1600번 말이 되고픈 원숭이 - java (0) | 2023.08.04 |
백준 - 1976번 여행 가자 - java (0) | 2023.07.29 |
백준 - 1068번 트리 - java (0) | 2023.07.29 |