
첫 indegree배열에 간선이 0일 경우의 모든 정점을 큐에 넣는다.

큐에 첫 원소인 A에서 출발한 정점의 indegree배열의 값을 1감소 해준다. 그리고, 큐에서 나와 위상 정렬 결과에 출력한다.







N명의 학생들을 키 순서대로 줄을 세우기 위해, 일부 학생들의 키를 비교한 결과를 주어졌을 때 줄을 세우는 프로그램을 작성하시오.
3 2
1 3
2 3
1 2 3
const fs = require("fs");
const input = fs
.readFileSync("dev/stdin")
.toString()
.trim()
.split("\n")
.map((item) => item.split(" "));
const shift = input.shift().map(Number); // [N,M]
// 정점에서 출발한 간선들을 담아 놓을 배열 (ex: A -> B = [B])
let indegree = Array.from({ length: shift[0] }, () => []);
// 정점의 갯수 만큼 연결된 간선 개수의 배열을 만들어준다.
let countArr = Array(Number(shift[0])).fill(0); //
let ans = [];
function answersort() {
let quene = [];
// 처음 부터 countArr의 원소가 0일 경우, quene에 넣어준다.
countArr.map((item, idx) => {
return item === 0 ? quene.push(idx + 1) : null;
});
// quene가 0일 경우, 위상정렬이 불가하거나, 위상정렬이 끝난 경우
while (quene.length) {
let zero = quene.shift(); // 큐에서 나온 정점
// zero에서 출발한 간선의 값을 줄여주고 만일 도착지점의 정점이 0일 경우 quene에 넣어준다.
indegree[zero - 1].forEach((item) => {
countArr[item - 1]--;
countArr[item - 1] === 0 ? quene.push(item) : null;
});
ans.push(zero);
}
}
for (let i = 0; i < input.length; i++) {
//출발한 정점, 연결된 정점들을 각 배열들에 연결
indegree[Number(input[i][0]) - 1].push(Number(input[i][1]));
countArr[Number(input[i][1]) - 1]++;
}
answersort();
console.log(ans.join(" "));
);
참고 링크
https://blog.encrypted.gg/1020 (바킹톡 - 위상정렬)