Skip to content

Commit 105fd0c

Browse files
yoouyeonuyeon0
authored andcommitted
๐Ÿ’ก ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค 72413 - ํ•ฉ์Šน ํƒ์‹œ ์š”๊ธˆ
1 parent 7fffe4e commit 105fd0c

2 files changed

Lines changed: 142 additions & 0 deletions

File tree

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
/*
2+
โญ๏ธ ๋ฌธ์ œ ์ •๋ณด โญ๏ธ
3+
๋ฌธ์ œ : 72413 - ํ•ฉ์Šน ํƒ์‹œ ์š”๊ธˆ
4+
๋ ˆ๋ฒจ : Level 3
5+
๋งํฌ : https://school.programmers.co.kr/learn/courses/30/lessons/72413
6+
*/
7+
8+
// ANCHOR: 26.02.08 ํ’€์ด
9+
class Heap {
10+
constructor(compare) {
11+
this.heap = [];
12+
this.compare = compare;
13+
}
14+
15+
size() {
16+
return this.heap.length;
17+
}
18+
19+
// ์ƒˆ๋กœ์šด ์›์†Œ๋ฅผ ํž™์— ์ถ”๊ฐ€
20+
// ๊ฐ€์žฅ ๋์— ๋„ฃ๊ณ  ์ œ์ž๋ฆฌ๋ฅผ ์ฐพ์•„์„œ ์˜ฌ๋ ค์ค€๋‹ค.
21+
push(value) {
22+
this.heap.push(value);
23+
this.siftUp(this.heap.length - 1);
24+
}
25+
26+
// root๋ฅผ ๋บ€๋‹ค.
27+
// ๊ฐ€์žฅ ๋ ๊ฐ’์„ root๋กœ ์˜ฌ๋ฆฌ๊ณ , ์ œ์ž๋ฆฌ๋ฅผ ์ฐพ์•„ ๋‚ด๋ฆฐ๋‹ค.
28+
pop() {
29+
if (this.size() <= 0) return null; // NOTE : ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ์ชฝ์ด ๋” ์ข‹์Œ
30+
if (this.size() === 1) return this.heap.pop(); // NOTE : ์ด๊ฑฐ ์žŠ์ง€ ๋ง™์‹œ๋‹ค.
31+
const ret = this.heap[0];
32+
this.heap[0] = this.heap.pop();
33+
this.siftDown(0);
34+
return ret;
35+
}
36+
37+
// ์ธ๋ฑ์Šค ๊ณต์‹... (์•”๊ธฐ๊ฐ€ ํ•„์š”ํ•จ...)
38+
// parent: ์ž์‹ ๋‘˜์ด ๊ฐ™์€ ๋ถ€๋ชจ๋ฅผ ๊ณต์œ ํ•œ๋‹ค. (1, 2) -> 3, => Math.floor((i - 1) / 2)
39+
// child: left child ๋ถ€ํ„ฐ ์ƒ๊ฐํ•˜๊ธฐ. ๋ถ€๋ชจ ํ•˜๋‚˜๋‹น ์ž์‹ 2์นธ์ด ์ƒ๊ธด๋‹ค.
40+
// - left: 0 -> 1, 1 -> 3, ... => (i * 2) + 1
41+
// - right: left ์˜†. => (i * 2) + 2
42+
43+
// push์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ
44+
// ์ œ์ž๋ฆฌ ์ฐพ์•„์„œ ์˜ฌ๋ผ๊ฐ€๋Š” ๋‹จ๊ณ„
45+
siftUp(idx) {
46+
// heap ๊ทœ์น™์— ์–ด๊ธ‹๋‚œ๋‹ค๋ฉด swap์œผ๋กœ ์˜ฌ๋ ค์ค€๋‹ค.
47+
// root์ด๊ฑฐ๋‚˜ heap ๊ทœ์น™์— ์ž˜ ๋งž๋Š”๋‹ค๋ฉด shiftUp ์ค‘๋‹จ
48+
while (idx > 0) {
49+
const parent = Math.floor((idx - 1) / 2);
50+
if (this.compare(this.heap[idx], this.heap[parent])) {
51+
this.swap(idx, parent);
52+
idx = parent;
53+
} else {
54+
break;
55+
}
56+
}
57+
}
58+
59+
// pop๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ
60+
// ์ œ์ž๋ฆฌ ์ฐพ์•„์„œ ๋‚ด๋ ค๊ฐ€๋Š” ๋‹จ๊ณ„
61+
siftDown(idx) {
62+
while (true) {
63+
const leftChild = idx * 2 + 1;
64+
const rightChild = idx * 2 + 2;
65+
66+
let targetChild;
67+
if (leftChild >= this.size()) break;
68+
else if (rightChild >= this.size()) targetChild = leftChild;
69+
else
70+
targetChild = this.compare(this.heap[leftChild], this.heap[rightChild])
71+
? leftChild
72+
: rightChild;
73+
74+
if (this.compare(this.heap[targetChild], this.heap[idx])) {
75+
this.swap(targetChild, idx);
76+
idx = targetChild;
77+
} else {
78+
break;
79+
}
80+
}
81+
}
82+
83+
// a ์ธ๋ฑ์Šค์™€ b์ธ๋ฑ์Šค์˜ ๊ฐ’์„ ์Šค์™‘
84+
swap(a, b) {
85+
[this.heap[a], this.heap[b]] = [this.heap[b], this.heap[a]];
86+
}
87+
}
88+
89+
function solution(n, s, a, b, fares) {
90+
// 0. ๋‹ค์ต์ŠคํŠธ๋ผ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์ค€๋น„ํ•˜๊ธฐ
91+
// adj: ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ (์›์†Œ: [v, w])
92+
const adj = Array.from({ length: n + 1 }, () => []);
93+
for (const [c, d, f] of fares) {
94+
adj[c].push([d, f]);
95+
adj[d].push([c, f]);
96+
}
97+
98+
// 1. ๋‹ค์ต์ŠคํŠธ๋ผ ๊ตฌํ˜„
99+
// start: ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐํ•  ์‹œ์ž‘ ์ง€์ .
100+
// ์‹œ์ž‘ ์ง€์ ๋ถ€ํ„ฐ ๋‹ค๋ฅธ ์ „์ฒด ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฐ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
101+
function dijkstra(start) {
102+
// 0) ์ดˆ๊ธฐ ์„ค์ •
103+
const dist = new Array(n + 1).fill(Infinity);
104+
dist[start] = 0;
105+
const minHeap = new Heap(([c1, v1], [c2, v2]) => c1 < c2);
106+
minHeap.push([0, start]);
107+
108+
// 1) minHeap์ด ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.
109+
while (minHeap.size() > 0) {
110+
const [cost, u] = minHeap.pop();
111+
// NOTE : dist ์ •๋ณด์™€ cost ์ •๋ณด๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด ๊ตฌ๋ฒ„์ „ ์ •๋ณด์ด๋ฏ€๋กœ ๋„˜์–ด๊ฐ„๋‹ค. (์ด๋ฏธ ์ฒ˜๋ฆฌํ•œ ๋…ธ๋“œ์ž„์„ ์˜๋ฏธ)
112+
if (cost !== dist[u]) continue;
113+
// 2) u์˜ ๊ฐ„์„ ๋“ค์„ ๋ชจ๋‘ ํƒ์ƒ‰ํ•œ๋‹ค.
114+
for (const [v, w] of adj[u]) {
115+
// 3) v๋กœ ๊ฐ€๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ๋น„์šฉ์˜ ์ตœ์†Ÿ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
116+
const nextCost = cost + w;
117+
if (nextCost < dist[v]) {
118+
dist[v] = nextCost;
119+
minHeap.push([nextCost, v]);
120+
}
121+
}
122+
}
123+
124+
return dist;
125+
}
126+
127+
// 2. S์—์„œ ์ถœ๋ฐœํ•˜๋Š” ๊ฒฝ๋กœ์˜ ์ดค๋‹จ๊ฑฐ๋ฆฌ
128+
const distS = dijkstra(s);
129+
// 3. A์—์„œ ์ถœ๋ฐœํ•˜๋Š” ๊ฒฝ๋กœ์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ (์ค‘๊ฐ„์ง€์  - A๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ์šฉ)
130+
const distA = dijkstra(a);
131+
// 4. B์—์„œ ์ถœ๋ฐœํ•˜๋Š” ๊ฒฝ๋กœ์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ (์ค‘๊ฐ„์ง€์  - B๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ์šฉ)
132+
const distB = dijkstra(b);
133+
134+
// 5. ๋ชจ๋“  ์ค‘๊ฐ„์ง€์  c๋ฅผ ํ™•์ธํ•˜๋ฉด์„œ ์ด ๋น„์šฉ์ด ์ตœ์†Œ๊ฐ€ ๋˜๋Š” c๋ฅผ ์ฐพ๋Š”๋‹ค.
135+
// ํ•ฉ์Šน์„ ์•ˆํ•ด๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์ž‘์ง€์ ๋„ ํ™•์ธํ•œ๋‹ค.
136+
let answer = Infinity;
137+
for (let c = 1; c <= n; c++) {
138+
answer = Math.min(answer, distS[c] + distA[c] + distB[c]);
139+
}
140+
return answer;
141+
}

โ€ŽProgrammers/README.mdโ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
| 68936 | แ„แ…ฏแ„ƒแ…ณแ„‹แ…กแ†ธแ„Žแ…ฎแ†จ แ„’แ…ฎ แ„€แ…ขแ„‰แ…ฎ แ„‰แ…ฆแ„€แ…ต | [68936_แ„แ…ฏแ„ƒแ…ณแ„‹แ…กแ†ธแ„Žแ…ฎแ†จ_แ„’แ…ฎ_แ„€แ…ขแ„‰แ…ฎ_แ„‰แ…ฆแ„€แ…ต.js](Level2/68936_แ„แ…ฏแ„ƒแ…ณแ„‹แ…กแ†ธแ„Žแ…ฎแ†จ_แ„’แ…ฎ_แ„€แ…ขแ„‰แ…ฎ_แ„‰แ…ฆแ„€แ…ต.js) | [๐Ÿ”—](https://school.programmers.co.kr/learn/courses/30/lessons/68936) |
6161
| 70129 | แ„‹แ…ตแ„Œแ…ตแ†ซ แ„‡แ…งแ†ซแ„’แ…ชแ†ซ แ„‡แ…กแ†ซแ„‡แ…ฉแ†จแ„’แ…กแ„€แ…ต | [70129_แ„‹แ…ตแ„Œแ…ตแ†ซ_แ„‡แ…งแ†ซแ„’แ…ชแ†ซ_แ„‡แ…กแ†ซแ„‡แ…ฉแ†จแ„’แ…กแ„€แ…ต.js](Level2/70129_แ„‹แ…ตแ„Œแ…ตแ†ซ_แ„‡แ…งแ†ซแ„’แ…ชแ†ซ_แ„‡แ…กแ†ซแ„‡แ…ฉแ†จแ„’แ…กแ„€แ…ต.js) | [๐Ÿ”—](https://school.programmers.co.kr/learn/courses/30/lessons/70129) |
6262
| 72411 | ๋ฉ”๋‰ด ๋ฆฌ๋‰ด์–ผ | [72411_๋ฉ”๋‰ด_๋ฆฌ๋‰ด์–ผ.js](Level2/72411_๋ฉ”๋‰ด_๋ฆฌ๋‰ด์–ผ.js) | [๐Ÿ”—](https://school.programmers.co.kr/learn/courses/30/lessons/72411) |
63+
| 72413 | ํ•ฉ์Šน ํƒ์‹œ ์š”๊ธˆ | [72413_ํ•ฉ์Šน_ํƒ์‹œ_์š”๊ธˆ.js](Level3/72413_ํ•ฉ์Šน_ํƒ์‹œ_์š”๊ธˆ.js) | [๐Ÿ”—](https://school.programmers.co.kr/learn/courses/30/lessons/72413) |
6364
| 72416 | ๋งค์ถœ ํ•˜๋ฝ ์ตœ์†Œํ™” | [72416_๋งค์ถœ_ํ•˜๋ฝ_์ตœ์†Œํ™”.js](Level4/72416_๋งค์ถœ_ํ•˜๋ฝ_์ตœ์†Œํ™”.js) | [๐Ÿ”—](https://school.programmers.co.kr/learn/courses/30/lessons/72416) |
6465
| 76502 | ๊ด„ํ˜ธ ํšŒ์ „ํ•˜๊ธฐ | [76502_๊ด„ํ˜ธ_ํšŒ์ „ํ•˜๊ธฐ.js](Level2/76502_๊ด„ํ˜ธ_ํšŒ์ „ํ•˜๊ธฐ.js) | [๐Ÿ”—](https://school.programmers.co.kr/learn/courses/30/lessons/76502) |
6566
| 77484 | แ„…แ…ฉแ„„แ…ฉแ„‹แ…ด แ„Žแ…ฌแ„€แ…ฉ แ„‰แ…ฎแ†ซแ„‹แ…ฑแ„‹แ…ช แ„Žแ…ฌแ„Œแ…ฅ แ„‰แ…ฎแ†ซแ„‹แ…ฑ | [77484_แ„…แ…ฉแ„„แ…ฉแ„‹แ…ด_แ„Žแ…ฌแ„€แ…ฉ_แ„‰แ…ฎแ†ซแ„‹แ…ฑแ„‹แ…ช_แ„Žแ…ฌแ„Œแ…ฅ_แ„‰แ…ฎแ†ซแ„‹แ…ฑ.js](Level1/77484_แ„…แ…ฉแ„„แ…ฉแ„‹แ…ด_แ„Žแ…ฌแ„€แ…ฉ_แ„‰แ…ฎแ†ซแ„‹แ…ฑแ„‹แ…ช_แ„Žแ…ฌแ„Œแ…ฅ_แ„‰แ…ฎแ†ซแ„‹แ…ฑ.js) | [๐Ÿ”—](https://school.programmers.co.kr/learn/courses/30/lessons/77484) |

0 commit comments

Comments
ย (0)