오늘 풀어본 문제는 문제집이다.
호가롭게 도전했지만 실패한 문제이다...
나는 dp 방식으로 풀어보려 했다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static Set <Integer> answer;
static boolean visited [];
static List<PriorityQueue<Integer>> pqList;
static int max=1;
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());
answer = new LinkedHashSet<>();
visited = new boolean[N+1];
pqList = new ArrayList<>();
for (int i = 0; i <= N; i++) {
pqList.add(new PriorityQueue<>());
}
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int pre = Integer.parseInt(st.nextToken());
int post = Integer.parseInt(st.nextToken());
pqList.get(post).add(pre);
}
for(int i=1; i<=N; i++) {
findValue(i);
}
// Set 요소 출력
for (int value : answer) {
System.out.print(value+" ");
}
}
static void findValue(int index) {
if(visited[index]) return;
visited[index] = true;
int size = pqList.get(index).size();
for(int i=1; i<=size; i++) {
int value = pqList.get(index).poll();
findAlone(value);
findValue(value);
answer.add(value);
}
answer.add(index);
}
static void findAlone(int index) {
for(int i=max; i<index; i++){
if ((pqList.get(i).size() == 0) && !visited[i]) {
max = i;
answer.add(i);
visited[i] = true;
}
}
}
}
위상정렬을 이용하는 문제였다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
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());
int [] indegree = new int[N+1];
List<Integer> [] quizZip = new List[N+1];
for (int i = 0; i <= N; i++) {
quizZip[i] = new ArrayList<>();
}
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int pre = Integer.parseInt(st.nextToken());
int post = Integer.parseInt(st.nextToken());
quizZip[pre].add(post);
indegree[post]++;
}
StringBuilder sb = new StringBuilder();
PriorityQueue <Integer> pq = new PriorityQueue<>();
for(int i=1; i<=N; i++){
if(indegree[i]==0){
pq.add(i);
}
}
while (!pq.isEmpty()){
int now = pq.poll();
sb.append(now+" ");
for(int i=0; i<quizZip[now].size(); i++){
int next = quizZip[now].get(i);
indegree[next]--;
}
}
System.out.println(sb);
}
}
위상정렬 개념 정리 : https://bcp0109.tistory.com/21