ํ ๋ ธ๋์์ ๋ค๋ฅธ ๋ ธ๋๊น์ง์ ์ต์ ๋น์ฉ์ ๊ตฌํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ค์ต์คํธ๋ผ!
๋ค์ต์คํธ๋ผ : ํ ์ ์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๊น์ง์ ์ต์ ๋น์ฉ์ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ
๋ค์ต์คํธ๋ผ๋ ์ฐ์ ์์ํ๋ฅผ ์ฌ์ฉํ๋๋ฐ
JS์๋ ์ฐ์ ์์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ง์ ๊ตฌํ
์ ๊ทผ ๋ฐฉ๋ฒ
1. ๋ฒ์ค ์ ๋ณด ์ธ์ ๋ฆฌ์คํธ, ๊ฐ ๋ ธ๋๊น์ง์ ์ต์ ๋น์ฉ์ ์ ์ฅํ ๋ฐฐ์ด(minArr), ์ด์ ์ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ฅผ ์ ์ฅํ ๋ฐฐ์ด(pre)์ ๋ง๋ ๋ค.
2. ์ฐ์ ์์ ํ์ ์์ ๋ ธ๋๋ฅผ ๋ฃ์ด์ค๋ค
3. ํ๊ฐ ๋น ๋๊น์ง ๋ ธ๋๋ฅผ ๊บผ๋ด์ minArr์ pre๋ฐฐ์ด์ ์ ๋ฐ์ดํธ ํ๋ค3๋ฒ์์ ๋ฐฐ์ด๋ค์ ์ ๋ฐ์ดํธ ํ ๋
1. minArr์ ์๋ ๊ฐ์ด ์ฐ์ ์์ ํ์์ ๊บผ๋ธ ๊ฐ๋ณด๋ค ์์ ๊ฒฝ์ฐ, ๊บผ๋ธ ๊ฐ์ ์ต์ ๋น์ฉ์ด ์๋์ผ๋ก continue;
2. minArr์ ์๋ ๊ฐ๋ณด๋ค ์ฐ์ ์์ ํ์์ ๊บผ๋ธ ๊ฐ์ด ์์ ๊ฒฝ์ฐ, ํ์ฌ ๊ธฐ์ค์์ ์ ์ผ ์ต์ ๋น์ฉ์ด๋ฏ๋ก minArr์ ๊ฐ์ ์ ๋ฐ์ดํธ ํด์ค๋ค.
๋ํ ํ์์ ๊บผ๋ธ ๋ ธ๋๊ฐ ์ต์ ๋น์ฉ์ธ ์ํ์ด๋ฏ๋ก ์ธ์ ํ ๋ ธ๋๋ค์ ๋น์ฉ๋ ํ์ธํด์ผ ํ๋ค!
(ํ์ฌ ๋ ธ๋์ ๋น์ฉ + ํ์ฌ ๋ ธ๋์์ ์ธ์ ๋ ธ๋๊น์ง์ ๋น์ฉ)์ minArr ๊ฐ๊ณผ ๋น๊ตํด์ ๋ ์์ ๊ฒฝ์ฐ์๋ ์ธ์ ๋ ธ๋์ minArr์ pre๋ฐฐ์ด์ ์ ๋ฐ์ดํธ ํ๊ณ ์ฐ์ ์์ ํ์ ๋ฃ์ด์ค๋ค.
ํ์ด ์ฝ๋
์ฐ์ ์์ ํ ๊ตฌํ ์ฝ๋๋ ํ์ด์ง ๊ฐ์ฅ ํ๋จ์ ์์ต๋๋ค!!
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
// ์
๋ ฅ๊ฐ์ด ์ฒซ ๋ฒ์งธ ์ค์๋ ์
๋ ฅ ๊ฐ์ ๊ธธ์ด(n), n๊ฐ์ ์ค์ ๊ฑธ์ณ์ ํ ์ค์ ํ๋์ ์
๋ ฅ๊ฐ์ด ์ฃผ์ด์ง ๋
const [n, m, ...input] = require('fs')
.readFileSync(filePath)
.toString()
.trim()
.split('\n');
function solution(N, M, Routes, SE) {
//์ต์๊ฐ๋ฐฐ์ด
const minArr = new Array(N + 1).fill(Infinity);
//๊ฒฝ๋ก ํ์ - ์ด์ ๋
ธ๋
const pre = new Array(N + 1).fill(0);
const pq = new PriorityQueue();
const adjacencyList = {};
const [start, end] = SE;
const answerRoute = [];
Routes.forEach(([start, end, weight]) => {
if (!adjacencyList[start]) adjacencyList[start] = [];
if (!adjacencyList[end]) adjacencyList[end] = [];
adjacencyList[start].push({ end, weight });
});
minArr[start] = 0;
pq.enqueue(start, 0);
while (pq.values.length) {
const { val, priority } = pq.dequeue();
if (minArr[val] < priority) continue;
minArr[val] = priority;
adjacencyList[val]?.forEach((item) => {
const { end, weight } = item;
if (priority + weight < minArr[end]) {
minArr[end] = priority + weight;
pre[end] = val;
pq.enqueue(end, minArr[end]);
}
});
}
function findPre(start, end) {
answerRoute.push(end);
if (start === end) return;
return findPre(start, pre[end]);
}
findPre(start, end);
return [
minArr[end],
answerRoute.length,
answerRoute.reverse().join(' '),
].join('\n');
}
const depArr = input.splice(-1);
const answer = solution(
Number(n),
Number(m),
input.map((item) => item.split(' ').map(Number)),
depArr[0].split(' ').map(Number),
);
console.log(answer);
์ฐ์ ์์ ํ ๊ตฌํ ์ฝ๋
class PriorityQueue {
constructor() {
this.values = [];
}
enqueue(val, priority) {
let newNode = new Node(val, priority);
this.values.push(newNode);
this.bubbleUp();
}
bubbleUp() {
let idx = this.values.length - 1;
const element = this.values[idx];
while (idx > 0) {
let parentIdx = Math.floor((idx - 1) / 2);
let parent = this.values[parentIdx];
if (element.priority >= parent.priority) break;
this.values[parentIdx] = element;
this.values[idx] = parent;
idx = parentIdx;
}
}
dequeue() {
const min = this.values[0];
const end = this.values.pop();
if (this.values.length > 0) {
this.values[0] = end;
this.sinkDown();
}
return min;
}
sinkDown() {
let idx = 0;
const length = this.values.length;
const element = this.values[0];
while (true) {
let leftChildIdx = 2 * idx + 1;
let rightChildIdx = 2 * idx + 2;
let leftChild, rightChild;
let swap = null;
if (leftChildIdx < length) {
leftChild = this.values[leftChildIdx];
if (leftChild.priority < element.priority) {
swap = leftChildIdx;
}
}
if (rightChildIdx < length) {
rightChild = this.values[rightChildIdx];
if (
(swap === null && rightChild.priority < element.priority) ||
(swap !== null && rightChild.priority < leftChild.priority)
) {
swap = rightChildIdx;
}
}
if (swap === null) break;
this.values[idx] = this.values[swap];
this.values[swap] = element;
idx = swap;
}
}
}
class Node {
constructor(val, priority) {
this.val = val;
this.priority = priority;
}
}
'๐ง ์๊ณ ๋ฆฌ์ฆ > ์ ํ๋ณ ๋ํ๋ฌธ์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์์์ ๋ ฌ][๋ฐฑ์ค] 2252 JS ํ์ด (1) | 2023.12.28 |
---|---|
[MST][๋ฐฑ์ค] 1197 ์ต์ ์คํจ๋ ํธ๋ฆฌ JS ํ์ด (1) | 2023.12.28 |
MST ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ ์ค๋ช (0) | 2023.12.28 |
[BFS][๋ฐฑ์ค] 7576 ํ ๋งํ js ํ์ด (1) | 2023.12.27 |