매일 3개의 주제를 골라 문제를 풀어봅시다.
subString 함수와 + 연산자의 남용으로 메모리초과가 발생한 것 같습니다.Stack으로 풀이한 내용이 많았습니다.Pattern class와 Matcher class를 사용하면 됩니다.import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class BAEKJOON_Gold_2_문제집 {
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());
List<List<Integer>> map = new ArrayList<>();
for (int i = 0; i <= n; i++) {
map.add(new ArrayList<>());
}
int[] inDegree = new int[n + 1];
int a, b;
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
a = Integer.parseInt(st.nextToken());
b = Integer.parseInt(st.nextToken());
map.get(a).add(b);
inDegree[b] += 1;
}
int[] result = new int[n + 1];
List<Integer> order = new ArrayList<>();
for (int i = 1; i <= n; i++) {
if (inDegree[i] == 0) {
order.add(i);
}
}
for (int i = 1; i <= n; i++) {
if (order.isEmpty()) {
break;
}
int p = order.remove(0);
result[i] = p;
for (int j = 0; j < map.get(p).size(); j++) {
int l = map.get(p).get(j);
if (inDegree[l] != 0) {
inDegree[l] -= 1;
if (inDegree[l] == 0) {
boolean inserted = false;
for (int k = 0; k < order.size(); k++) {
if (order.get(k) > l) {
order.add(k, l);
inserted = true;
break;
}
}
if (!inserted) {
order.add(l);
}
}
}
}
}
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= n; i++) {
sb.append(result[i]).append(" ");
}
System.out.println(sb.toString().trim());
br.close();
}
}