핵심 아이디어
문제와 입력 형식을 보자마자, 위상정렬로 풀 수 있는 문제임을 알 수 있다.
위상정렬 기본 템플릿을 적용하여 풀면된다.
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const solution = function (input) {
const [n, m] = input
.shift()
.split(' ')
.map((e) => parseInt(e));
const entry = Array.from({ length: n + 1 }, () => 0);
const relations = Array.from({ length: n + 1 }, () => []);
for (row of input) {
const [a, b] = row.split(' ').map((e) => parseInt(e));
entry[b]++;
relations[a].push(b);
}
const ans = [];
const q = [];
// entry가 0인 노드를 찾는다.
for (let i = 1; i <= n; i++) {
if (entry[i] === 0) {
q.push(i);
entry[i] = -1;
}
}
while (q.length > 0) {
const currStudent = q.shift();
ans.push(currStudent);
for (other of relations[currStudent]) {
entry[other]--;
if (entry[other] === 0) {
q.push(other);
entry[other] = -1;
}
}
}
console.log(ans.join(' '));
};
const input = [];
rl.on('line', function (line) {
input.push(line);
}).on('close', function () {
solution(input);
process.exit();
});
'개발 > 알고리즘' 카테고리의 다른 글
[Frontend Interview] 프로그레시브 렌더링이 무엇인가? (0) | 2021.01.07 |
---|---|
[Javascript][BOJ] 1009 분산처리 (0) | 2021.01.07 |
[Javascript][BOJ] 2458 키 순서 (0) | 2021.01.05 |
[Javascript][BOJ] 11055 가장 큰 증가 부분 수열 (0) | 2021.01.03 |
[Javascript][BOJ] 1956 운동 (플로이드 와샬, 사이클) (0) | 2020.12.30 |