์์์ ๋ ฌ
: ๋ฐฉํฅ ๊ทธ๋ํ์์ ๋ ธ๋๋ค๊ฐ ์ ํ ์์๋ฅผ ์๋ฐฐํ์ง ์๊ณ ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ
๊ตฌํ๋ฒ
1. ๋งจ ์ฒ์ ๋ชจ๋ ๊ฐ์ ์ ์ฝ์ผ๋ฉฐ indegree ํ ์ด๋ธ์ ์ฑ์ด๋ค
2. indegree๊ฐ 0์ธ ์ ์ ๋ค์ ๋ชจ๋ ํ์ ๋ฃ๋๋ค
3. ํ์์ ์ ์ ์ ๊บผ๋ด์ด ์์ ์ ๋ ฌ ๊ฒฐ๊ณผ์ ์ถ๊ฐํ๋ค
4. ํด๋น ์ ์ ์ผ๋ก๋ถํฐ ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ ์ ์ indegree ๊ฐ์ 1 ๊ฐ์์ํจ๋ค. ์ด ๋ indegree๊ฐ 0์ด ๋์๋ค๋ฉด ๊ทธ ์ ์ ์ ํ์ ์ถ๊ฐํ๋ค
5. ํ๊ฐ ๋น ๋๊น์ง 3,4๋ฒ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค
์ข ๋ ์์ธํ ์ค๋ช ์ด ํ์ํ๋ค๋ฉด
์ถ์ฒ: ๋ฐํน๋ ๋ธ๋ก๊ทธ
https://blog.encrypted.gg/1020
์์ ์ ๋ ฌ ๋ฌธ์ ์ ์ ์ฉํ๊ธฐ
๋ฌธ์
N๋ช ์ ํ์๋ค์ ํค ์์๋๋ก ์ค์ ์ธ์ฐ๋ ค๊ณ ํ๋ค. ๊ฐ ํ์์ ํค๋ฅผ ์ง์ ์ฌ์ ์ ๋ ฌํ๋ฉด ๊ฐ๋จํ๊ฒ ์ง๋ง, ๋ง๋ ํ ๋ฐฉ๋ฒ์ด ์์ด์ ๋ ํ์์ ํค๋ฅผ ๋น๊ตํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ธฐ๋ก ํ์๋ค. ๊ทธ๋๋ง๋ ๋ชจ๋ ํ์๋ค์ ๋ค ๋น๊ตํด ๋ณธ ๊ฒ์ด ์๋๊ณ , ์ผ๋ถ ํ์๋ค์ ํค๋ง์ ๋น๊ตํด ๋ณด์๋ค.
์ผ๋ถ ํ์๋ค์ ํค๋ฅผ ๋น๊ตํ ๊ฒฐ๊ณผ๊ฐ ์ฃผ์ด์ก์ ๋, ์ค์ ์ธ์ฐ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)์ด ์ฃผ์ด์ง๋ค. M์ ํค๋ฅผ ๋น๊ตํ ํ์์ด๋ค. ๋ค์ M๊ฐ์ ์ค์๋ ํค๋ฅผ ๋น๊ตํ ๋ ํ์์ ๋ฒํธ A, B๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋ ํ์ A๊ฐ ํ์ B์ ์์ ์์ผ ํ๋ค๋ ์๋ฏธ์ด๋ค.
ํ์๋ค์ ๋ฒํธ๋ 1๋ฒ๋ถํฐ N๋ฒ์ด๋ค.
์ ๊ทผ๋ฒ
1. ๊ทธ๋ํ ์ธ์ ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ
2. ๊ทธ๋ํ indegree ๋ฐฐ์ด ๋ง๋ค๊ธฐ
3. indegree๊ฐ 0์ธ ์ ์ ๋ค ํ์ ๋ฃ๊ธฐ
4. indegree๊ฐ 0์ธ ์ ์ ๋ค์ ๋ชจ๋ ์ธ์ ์ ์ ๋ค์ indegree๊ฐ -1
5. ๋ง์ฝ ์ธ์ ์ ์ ์ indegree๊ฐ 0์ด ๋๋ฉด ํ์ ๋ฃ์ด์ค
6. ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต
class Node {
constructor(val) {
this.val = val;
this.next = null;
}
}
class Queue {
constructor() {
this.front = null;
this.rear = null;
this.length = 0;
}
enqueue(val) {
const newNode = new Node(val);
if (!this.front) {
this.front = newNode;
this.rear = newNode;
} else {
this.rear.next = newNode;
this.rear = newNode;
}
return ++this.length;
}
dequeue() {
if (!this.front) return null;
const tmp = this.front;
if (this.front === this.rear) {
this.rear = null;
}
this.front = this.front.next;
this.length--;
return tmp.val;
}
}
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
// ์
๋ ฅ๊ฐ์ด ์ฒซ ๋ฒ์งธ ์ค์๋ ์
๋ ฅ ๊ฐ์ ๊ธธ์ด(n), n๊ฐ์ ์ค์ ๊ฑธ์ณ์ ํ ์ค์ ํ๋์ ์
๋ ฅ๊ฐ์ด ์ฃผ์ด์ง ๋
const [n, ...input] = require('fs')
.readFileSync(filePath)
.toString()
.trim()
.split('\n');
function solution(N, M, list) {
const adj = {};
const indegree = new Array(N + 1).fill(0);
const queue = new Queue();
const result = [];
list.forEach(([v1, v2]) => {
if (!adj[v2]) adj[v2] = [];
//๊ทธ๋ํ ์ฐ๊ฒฐ๋ฆฌ์คํธ ๋ง๋ค๊ณ
//indegree ๋ฐฐ์ด ์ฑ์ฐ๊ธฐ
adj[v2].push(v1);
indegree[v1]++;
});
//indegree 0์ธ ์ ์ ๋ค ํ์ ๋ฃ๊ธฐ
indegree.forEach((v, idx) => {
if (idx !== 0 && v === 0) {
queue.enqueue(idx);
result.push(idx);
}
});
while (queue.length) {
const v = queue.dequeue();
//๋ชจ๋ ์ ์ ๋ค์ indegree ๊ฐ -1
adj[v]?.forEach((v2) => {
if (indegree[v2] !== 0) {
indegree[v2]--;
//indegree๊ฐ์ด 0์ด๋ผ๋ฉด ํ์ ๋ฃ์ด์ค
if (indegree[v2] === 0) {
result.push(v2);
queue.enqueue(v2);
}
}
});
}
return result.reverse().join(' ');
}
const arr = n.split(' ').map(Number);
const answer = solution(
arr[0],
arr[1],
input.map((r) => r.split(' ').map(Number)),
);
console.log(answer);
'๐ง ์๊ณ ๋ฆฌ์ฆ > ์ ํ๋ณ ๋ํ๋ฌธ์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ค์ต์คํธ๋ผ][๋ฐฑ์ค] 117799 ์ต์๋น์ฉ ๊ตฌํ๊ธฐ2 JS (2) | 2024.01.10 |
---|---|
[MST][๋ฐฑ์ค] 1197 ์ต์ ์คํจ๋ ํธ๋ฆฌ JS ํ์ด (1) | 2023.12.28 |
MST ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ ์ค๋ช (0) | 2023.12.28 |
[BFS][๋ฐฑ์ค] 7576 ํ ๋งํ js ํ์ด (1) | 2023.12.27 |