Skip to content

Commit 8588d76

Browse files
committed
Feat: 그래프 네트워크 연결(1922)
1 parent 2a5de10 commit 8588d76

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
const fs = require("fs");
2+
const filePath =
3+
process.platform === "linux" ? "/dev/stdin" : `${__dirname}/input.txt`;
4+
let input = fs
5+
.readFileSync(filePath)
6+
.toString()
7+
.trim()
8+
.split("\n")
9+
.map((x) => x.trim());
10+
11+
const n = Number(input[0]);
12+
const arr = input.slice(2).map((x) => x.split(" ").map((x) => +x));
13+
let answer = 0;
14+
15+
// 1. 그래프의 간선들의 가중치를 오름차순으로 정렬
16+
arr.sort((a, b) => a[2] - b[2]);
17+
18+
const parent = [];
19+
for (let i = 0; i < n; i++) parent.push(i);
20+
21+
// 각 섬의 부모를 찾는 재귀 함수
22+
// 만약 초기 값이 아니라면 parent[x]를 이용해 위로 올라가서 부모값 찾음
23+
const getParent = (parent, x) => {
24+
if (parent[x] === x) return x;
25+
return (parent[x] = getParent(parent, parent[x]));
26+
};
27+
28+
// 두 섬의 부모를 하나로 합쳐준다.
29+
// 이때 두 부모중 작은 값을 가지는 부모로 합쳐준다.
30+
const unionParent = (parent, x, y) => {
31+
const n1 = getParent(parent, x);
32+
const n2 = getParent(parent, y);
33+
if (n1 < n2) return (parent[n2] = n1);
34+
else return (parent[n1] = n2);
35+
};
36+
37+
// 두 섬의 부모를 찾고, 부모가 같으면 true, 다르면 false return
38+
const findParent = (parent, x, y) => {
39+
const n1 = getParent(parent, x);
40+
const n2 = getParent(parent, y);
41+
if (n1 === n2) return true;
42+
else return false;
43+
};
44+
45+
// 2. 사이클을 형성하지 않는 선에서 순서대로 간선을 선택
46+
for (let node of arr) {
47+
if (!findParent(parent, node[0], node[1])) {
48+
// 3. 선택된 간선을 MST 집합에 추가한다.
49+
answer += node[2]; // 정답에 해당 가중치를 더해준다 (오름차순으로 정렬해서 작은값 선택 가능)
50+
unionParent(parent, node[0], node[1]); // 이제 두 섬은 연결되었으니 합쳐준다
51+
}
52+
}
53+
54+
console.log(answer);

0 commit comments

Comments
 (0)