위상정렬
Map<String, Integer> map = new HashMap<>();
List<List<Integer>> list = new ArrayList<>();
for (int i = 0; i < subjects.length; i++) {
map.put(subjects[i], i);
list.add(new ArrayList<>());
}
int[] indegree = new int[subjects.length];
for (int i = 0; i < course.length; i++) {
String[] split = course[i].split(" ");
int s1 = map.get(split[0]);
int s2 = map.get(split[1]);
list.get(s2).add(s1);
indegree[s1]++;
}
Queue<Integer> queue = new LinkedList<>();
List<Integer> order = new ArrayList<>();
for (int i = 0; i < indegree.length; i++) {
if (indegree[i] == 0)
queue.add(i);
}
while (!queue.isEmpty()){
Integer now = queue.poll();
order.add(now);
List<Integer> nextSub = list.get(now);
for(Integer sub : nextSub){
indegree[sub]--;
if (indegree[sub] == 0)
queue.add(sub);
}
}
public String[] solution(String[] subjects, String[] course){
String[] answer = new String[subjects.length];
Map<String, Integer> map = new HashMap<>();
List<List<Integer>> list = new ArrayList<>();
for (int i = 0; i < subjects.length; i++) {
map.put(subjects[i], i);
list.add(new ArrayList<>());
}
int[] indegree = new int[subjects.length];
for (int i = 0; i < course.length; i++) {
String[] split = course[i].split(" ");
int s1 = map.get(split[0]);
int s2 = map.get(split[1]);
list.get(s2).add(s1);
indegree[s1]++;
}
List<Integer> order = new ArrayList<>();
Queue<Integer> queue = new LinkedList<>();
for (int i = 0; i < indegree.length; i++) {
if (indegree[i] == 0)
queue.add(i);
}
while (!queue.isEmpty()){
Integer now = queue.poll();
order.add(now);
List<Integer> nextSub = list.get(now);
for(Integer sub : nextSub){
indegree[sub]--;
if (indegree[sub] == 0)
queue.add(sub);
}
}
for (int i = 0; i < order.size(); i++) {
answer[i] = subjects[order.get(i)];
}
return answer;
}