2023. 10. 22. 16:40ใCoding Test/Programmers
๐๋ฌธ์ ๋ณด๋ฌ๊ฐ๊ธฐ
๐ง๐ปํ์ด ๊ณผ์
๐์ต์ ์ ์ฅ ํธ๋ฆฌ(MST, Minimum Spanning Tree)๋ฅผ ํ์ฉํ๋ ๋ฌธ์ ์ ๋๋ค. ์ต์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๋ ๊ณผ์ ์์ ํฌ๋ฃจ์ค์นผ(Kruskal) ๋๋ ํ๋ฆผ(Prim)์ ์๊ณ ๋ฆฌ์ฆ์ด ์ฌ์ฉ๋๋ฉฐ, ์ ๋ ํฌ๋ฃจ์ค์นผ(Kruskal)์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ํ์์ต๋๋ค.
์ ์ฅ ํธ๋ฆฌ์ ์กฐ๊ฑด ์ค ํ๋๋ก ์ฌ์ดํด์ด ์์ผ๋ฉด ์๋๋ค๊ฐ ์๋๋ฐ, ๋ถ๋ฆฌ ์งํฉ(Disjoint set)์ ๊ฐ๋ ์ธ ๐์ ๋์จ ํ์ธ๋(Union Find)๋ผ ๋ถ๋ฆฌ๋ ์๋ฃ๊ตฌ์กฐ๋ก ์ฝ๊ฒ ์ ๊ฒํ ์ ์์ต๋๋ค.
์ด๋ฒ ๊ธฐํ์ ๊ณต๋ถํ์ฌ ๊ฐ๋ ์ ํ์ต ํ, ์ด๋ฅผ ํ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์์ต๋๋ค. ์ ๊ฐ ์ด๊ฑธ ์์๋๋ผ๋ฉด, NC Soft ์ฝ๋ฉ ํ ์คํธ์์ ํ ๋ฌธ์ ๋ ๊ทธ๋ฅ ํ๊ณ ๋์ด๊ฐ์ํ ๋ฐ ๋ง์ด์ฃ ... ์์ฝ๋ค์.
โ๏ธ์์ค ์ฝ๋ ๋ฐ ๊ฒฐ๊ณผ
#include <vector>
#include <algorithm>
using namespace std;
class DisjointSet
{
public:
DisjointSet(int n) : parent(n), rank(n, 1)
{
for (int i = 0; i < n; i++)
parent[i] = i;
}
int Find(int node)
{
if (parent[node] == node)
return node;
return parent[node] = Find(parent[node]);
}
void Merge(int node1, int node2)
{
node1 = Find(node1), node2 = Find(node2);
if (node1 == node2)
return;
if (rank[node1] > rank[node2])
swap(node1, node2);
parent[node1] = node2;
if (rank[node1] == rank[node2])
rank[node2]++;
}
bool IsInSameSet(int node1, int node2)
{
node1 = Find(node1), node2 = Find(node2);
return node1 == node2;
}
private:
vector<int> parent;
vector<int> rank;
};
int solution(int n, vector<vector<int>> costs) {
int answer = 0;
DisjointSet ds(n);
sort(costs.begin(), costs.end(), [](const vector<int>& c1, const vector<int>& c2) { return c1[2] < c2[2]; });
for (const auto& cost : costs)
{
int node1 = cost[0], node2 = cost[1];
if (ds.IsInSameSet(node1, node2))
continue;
ds.Merge(node1, node2);
answer += cost[2];
}
return answer;
}
'Coding Test > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Programmers] Lv3. ๋ถ๋๋ณต๊ท | C++ (0) | 2024.01.13 |
---|---|
[Programmers] Lv3. [1์ฐจ] ์ ํ๋ฒ์ค | C++ (0) | 2023.11.18 |
[Programmers] Lv3. ๊ฐ์ฅ ๋จผ ๋ ธ๋ | C++ (0) | 2023.10.22 |
[Programmers] Lv3. [์นด์นด์ค ์ธํด] ๋ณด์ ์ผํ | C++ (0) | 2023.10.22 |
[Programmers] Lv3. ์ด์ค์ฐ์ ์์ํ | C++ (0) | 2023.09.10 |