๐ก์ ์ฅํธ๋ฆฌ?
- ์ฃผ์ด์ง ์ฐ๊ฒฐ ๊ทธ๋ํ์์ ์ฌ์ดํด์ ํ์ฑํ๋ ๊ฐ์ ์ ์ ๊ฑฐํ์ฌ ๋ง๋ ํธ๋ฆฌ
- ์ ์ ์ ์๊ฐ n ๊ฐ, ์ ์ฅํธ๋ฆฌ์ ๊ฐ์ ์ ์๋ n-1 ๊ฐ
๐ก์ต์ ์ ์ฅ ํธ๋ฆฌ?
- ์ฃผ์ด์ง ๊ฐ์ค์น ๊ทธ๋ํ์์ ์ฌ์ดํด์ด ์์ด ๋ชจ๋ ์ ๋ค์ ์ฐ๊ฒฐ์ํจ ํธ๋ฆฌ๋ค ์ค ์ ๋ถ(๊ฐ์ )๋ค์ ๊ฐ์ค์น ํฉ์ด ์ต์์ธ ํธ๋ฆฌ
๐ก์ด๋ป๊ฒ ์ต์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ์ฐพ์๊น?
- ๋ฌด์์ ๊ธฐ๋ฒ
- ๊ฐ๋ฅํ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ๋ชจ๋ ๊ตฌํ ๋ค์, ์ต์ ๋น์ฉ์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ์ ํ
- ๋ชจ๋ ์ ์ ๊ฐ์ ๊ฐ์ ์ด ์๋ ์์ ๊ทธ๋ํ์ ๊ฒฝ์ฐ ์ ์ฅ ํธ๋ฆฌ์ ์๋ n^(n-2)
- ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ
- ํฌ๋ฆฌ์ค์ปฌ๊ณผ ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ ์์
- ์๊ณ ๋ฆฌ์ฆ ์ ๋ ฅ์ 1๊ฐ์ ์ฐ๊ฒฐ์์๋ก ๋ ๊ฐ์ค์น ๊ทธ๋ํ์ด๋ค.
๐กํฌ๋ฆฌ์ค์ปฌ ์๊ณ ๋ฆฌ์ฆ
- ๊ฐ์ค์น๊ฐ ๊ฐ์ฅ ์์ ์ ๋ถ์ด ์ฌ์ดํด์ ๋ง๋ค์ง ์์ ๋์๋ง '์์ฌ๋ด์ด' ๊ทธ ์ ๋ถ์ ์ถ๊ฐ ์ํจ๋ค.
- ๊ฐ ๋จ๊ณ์์ ๊ฐ์ค์น๊ฐ ์ต์์ธ ๊ฐ์ ์ ํ (๊ฐ์ค์น ์ ๋ ฌ)
- ์ ํํ ๊ฐ์ ๋๋ฌธ์ ์ฌ์ดํด์ด ๋ง๋ค์ด์ง๋ค๋ฉด ์ ํํ ๊ฐ์ ์ ๋ฒ๋ฆผ (union-find ์ฐ์ฐ)
- ๋ฐ์๋ค์ฌ์ง ๊ฐ์ ์ ์๊ฐ n-1๊ฐ๊ฐ ๋๋ฉด ์ข ๋ฃ
// ์
๋ ฅ : ๊ฐ์ค์น ๊ทธ๋ํ G=(V,E), |V|=n, |E|=m
// ์ถ๋ ฅ : ์ต์ ์ ์ฅ ํธ๋ฆฌ T
// ๊ฐ์ค์น์ ์ค๋ฆ์ฐจ ์์ผ๋ก ์ ๋ถ๋ค์ ์ ๋ ฌํ๋ค. ์ ๋ ฌ๋ ์ ๋ถ ๋ฆฌ์คํธ๋ฅผ L์ด๋ผ๊ณ ํ์.
T=0 // ํธ๋ฆฌ T๋ฅผ ์ด๊ธฐํ ์ํจ๋ค.
while(T์ ์ ๋ถ ์ < n-1){
// L์์ ๊ฐ์ฅ ์์ ๊ฐ์ค์น๋ฅผ ๊ฐ์ง ์ ๋ถ e๋ฅผ ๊ฐ์ ธ์ค๊ณ e๋ฅผ L์์ ์ ๊ฑฐํ๋ค.
if (์ ๋ถ e๊ฐ T์ ์ถ๊ฐ๋์ด ์ฌ์ดํด์ ๋ง๋ค์ง ์์ผ๋ฉด) // feasibility check
e๋ฅผ T์ ์ถ๊ฐ ์ํจ๋ค.
else // e๊ฐ T์ ์ถ๊ฐ๋์ด ์ฌ์ดํด์ด ๋ง๋ค์ด์ง๋ ๊ฒฝ์ฐ
e๋ฅผ ๋ฒ๋ฆฐ๋ค.
}
return ํธ๋ฆฌ T // T๋ ์ต์ ์ ์ฅ ํธ๋ฆฌ์ด๋ค.
โ์ฌ์ดํด์ ์ด๋ป๊ฒ ํ์ธํ ๊น?
- union-find ์๊ณ ๋ฆฌ์ฆ
- (๋ ์์๊ฐ ๋ค๋ฅธ ์งํฉ์ ์ํ ๋) ๋ ์งํฉ๋ค์ ํฉ์งํฉ์ ์์ฑํ๋ union
- ํน์ ์์๊ฐ ์ด๋ค ์งํฉ์ ์ํ๋์ง ์์๋ด๋ find
- ํฌ๋ฌ์ค์ปฌ์ MST ์๊ณ ๋ฆฌ์ฆ์์ ์ฌ์ดํด ๊ฒ์ฌ์ ์ฌ์ฉ
- ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ๊ฐ ์งํฉ์ tree ํํ๋ก ๊ตฌ์ฑ
- Find(a) : a๊ฐ ํฌํจ๋ ์งํฉ์ ๊ตฌ์ฑํ๋ tree์ root ๋ฅผ return
- Union(a,b) : a์ b๊ฐ ์๋ก ๋ค๋ฅธ ์งํฉ์ ์ํ๊ณ , ๊ฐ๊ฐ ์ํ tree์ root๋ผ๊ณ ํ ๋, ๋ tree๋ฅผ mergeํ์ฌ ๋์๋๋ ๋ ์งํฉ์ ํฉ์งํฉ (union)์ ํํํ๋ tree๋ฅผ ๊ตฌ์ฑํ๋ค.
- ๋์์ v์ u ๋ฐ ๊ทธ๋ค์ ์ํ ์งํฉ์ unionํ๋ ค๋ฉด,
-
// v์ u์ root์ ์ฐพ๊ธฐ a=find(v); b=find(u); if(a!=b){ // ๋ง์ฝ ๊ฐ์ ๋ฃจํธ๊ฐ ์๋๋ผ๋ฉด, v์ u๋ // ๊ฐ์ ๋ถ๋ถ ์งํฉ์ด๋ค. union(a,b); }
edge_set kruskal_MST(edge_set E, int n){
sort(E);
edge_set MST_E = {};
for (i=0;i<n;i++) init_set(i); // n๊ฐ์ ์งํฉ(ํธ๋ฆฌ)๋ฅผ ์์ฑ
while(MST_E์ ๊ฐ์ ์ < n-1){
e = (u,v) = E์ ์ต์ ๊ฐ์ค์น ๊ฐ์ ;
if(find(u) != find(v)) // u์ v๊ฐ ๋ค๋ฅธ ์งํฉ(ํธ๋ฆฌ)์์, ์๋ก์ ์งํฉ์ ํด๋นํ์ง ์์ผ๋ฉด cycle X
{
MST_E = MST_E || {(u,v)} ;
union(u, v) // ๋ ์งํฉ(ํธ๋ฆฌ)์ ํฉ๋ณ
}
}
return MST_E;
}
๐กC++ ์ฝ๋
#include <iostream>
#include <vector>
using namespace std;
// ๊ฐ์ ๋ค์ ์ ๋ณด
class Edge{
public:
int node[2];
int distance;
Edge(int x, int y, int distance){
this->node[0] = x;
this->node[1] = y;
this->distance = distance;
}
};
//quickSort ์ ๋ ฌํจ์
void quickSort(vector<Edge>& edges, int start, int end){
if(start>=end) return;
int key = start;
int i = start+1;
int j = end;
int temp;
while(i<=j){
while(i<=end && edges[i].distance <= edges[key].distance) i++;
while(j>start && edges[j].distance >= edges[key].distance) j--;
if(i>j){
temp = edges[j].distance;
edges[j].distance = edges[key].distance;
edges[key].distance = temp;
temp = edges[j].node[0];
edges[j].node[0] = edges[key].node[0];
edges[key].node[0] = temp;
temp = edges[j].node[1];
edges[j].node[1] = edges[key].node[1];
edges[key].node[1] = temp;
} else{
temp = edges[j].distance;
edges[j].distance = edges[i].distance;
edges[i].distance = temp;
temp = edges[j].node[0];
edges[j].node[0] = edges[i].node[0];
edges[i].node[0] = temp;
temp = edges[j].node[1];
edges[j].node[1] = edges[i].node[1];
edges[i].node[1] = temp;
}
}
quickSort(edges, start, j-1);
quickSort(edges, j+1, end);
}
int getRoot(int n, int root[]){
if(root[n]==n) return n;
return getRoot(root[n], root);
}
bool isCycle(int x, int y, int root[]){
x = getRoot(x, root);
y = getRoot(y, root);
if(x==y) return true;
else return false;
}
void unionRoot(int x, int y, int root[]){
x = getRoot(x, root);
y = getRoot(y, root);
if(x < y) root[y] = x;
else root[x] = y;
}
int main(){
int n; // ์ ์ ์ ๊ฐ์
int m; // ๊ฐ์ ์ ๊ฐ์
cin >> n >> m;
vector<Edge> edges;
// ์ ๋ ์ธ๋ฑ์ค x,y ์ ๊ฐ์ค์น ๊ตฌํ๊ธฐ
for(int i=0;i<m;i++){
int x, y, w;
cin >> x >> y >> w;
edges.push_back(Edge(x, y, w));
}
quickSort(edges, 0, edges.size()-1);
int root[n]; // root๋ฐฐ์ด
// ์ด๊ธฐ root ๋ฐฐ์ด์ ์๊ธฐ์์ ์ด root ์ธ ์ํ์
for( int i=1;i<=n;i++){
root[i]=i;
}
int sum = 0; // ๊ฐ์ค์น์ ํฉ (result)
for( int i=0;i<edges.size();i++ ){
if(!isCycle(edges[i].node[0], edges[i].node[1], root)){
sum+=edges[i].distance;
unionRoot(edges[i].node[0], edges[i].node[1], root);
}
}
cout << sum <<endl;
}
๐กํฌ๋ฌ์ค์ปฌ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋
// ์
๋ ฅ : ๊ฐ์ค์น ๊ทธ๋ํ G=(V,E), |V|=n, |E|=m
// ์ถ๋ ฅ : ์ต์ ์ ์ฅ ํธ๋ฆฌ T
// (1) ๊ฐ์ค์น์ ์ค๋ฆ์ฐจ ์์ผ๋ก ์ ๋ถ๋ค์ ์ ๋ ฌํ๋ค. ์ ๋ ฌ๋ ์ ๋ถ ๋ฆฌ์คํธ๋ฅผ L์ด๋ผ๊ณ ํ์.
T=0 // (2) ํธ๋ฆฌ T๋ฅผ ์ด๊ธฐํ ์ํจ๋ค.
while(T์ ์ ๋ถ ์ < n-1){ // (3)
// L์์ ๊ฐ์ฅ ์์ ๊ฐ์ค์น๋ฅผ ๊ฐ์ง ์ ๋ถ e๋ฅผ ๊ฐ์ ธ์ค๊ณ e๋ฅผ L์์ ์ ๊ฑฐํ๋ค.
if (์ ๋ถ e๊ฐ T์ ์ถ๊ฐ๋์ด ์ฌ์ดํด์ ๋ง๋ค์ง ์์ผ๋ฉด) // feasibility check
e๋ฅผ T์ ์ถ๊ฐ ์ํจ๋ค.
else // e๊ฐ T์ ์ถ๊ฐ๋์ด ์ฌ์ดํด์ด ๋ง๋ค์ด์ง๋ ๊ฒฝ์ฐ
e๋ฅผ ๋ฒ๋ฆฐ๋ค.
}
return ํธ๋ฆฌ T // T๋ ์ต์ ์ ์ฅ ํธ๋ฆฌ์ด๋ค.
(1) ์ ๋ ฌํ๋๋ฐ O(mlogm) ์๊ฐ. ๋จ, m์ ์ ๋ ฅ๊ทธ๋ํ์ ์๋ ์ ๋ถ์ ์
(2) T๋ฅผ ์ด๊ธฐํํ๋ ๊ฒ์ด๋ฏ๋ก O(1) ์๊ฐ
(3-1) ์ต์ ์ ๊ฒฝ์ฐ m๋ฒ ์ํ(๊ฐ๊ฐ์ ์ ๋ถ m๊ฐ์ ๋ํด์ ์ํ) = ์ฆ, ๊ทธ๋ํ์ ๋ชจ๋ ์ ๋ถ์ด while-๋ฃจํ ๋ด์์ ์ฒ๋ฆฌ๋๋ ๊ฒฝ์ฐ
(3-2) while ๋ฃจํ ๋ด์์ L๋ก๋ถํฐ ๊ฐ์ ธ์จ ์ ๋ถ e๊ฐ ์ฌ์ดํด์ ๋ง๋๋ ์ง๋ฅผ ๊ฒ์ฌํ๋๋ฐ, ์ด๋ O(log*m) ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
(3) while-loop = m*O(log*m)
๋ฐ๋ผ์, ํฌ๋ฌ์ค์ปฌ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๋ O(mlogm) + O(mlog*m) = O(mlogm) ์ด๋ค. (์ ๋ ฌ + while)
โฐlog*n ?
- O(mlog*m) = O(m)
- logํจ์๋ฅผ n์ ์ฐ์ํด์ ๋ช๋ฒ์ด๋ ์ ์ฉํด์ผ 1 ์ดํ๊ฐ ๋๋๊ฐ?
โฐ๊ณต๋ถ ๊ธฐ๋ก
๐กํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ
- ์ฃผ์ด์ง ๊ฐ์ค์น ๊ทธ๋ํ์์ ์์์ ์ ํ๋๋ฅผ ์ ํํ ํ, ๊ทธ ์ ์ผ๋ก๋ถํฐ ๊ฐ ์ ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ ํ, ๊ฐ์ฅ ์งง์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ๋ ์ ์ ์ถ๊ฐ์์ผ ํธ๋ฆฌ๋ฅผ ๋ง๋ ๋ค.
- ๊ฒฐ๊ตญ n-1๊ฐ์ ์ ๋ถ์ ํ๋์ฉ ์ถ๊ฐ์์ผ ํธ๋ฆฌ๋ฅผ ๋ง๋ ๋ค๋ ํจ๊ณผ์ธ๊ฒ!
- ์ถ๊ฐ๋๋ ์ ๋ถ์ ํ์ฌ๊น์ง ๋ง๋ค์ด์ง ํธ๋ฆฌ๋ฅผ ์ฐ๊ฒฐ์ํฌ ๋, '์์ฌ์ ๋ด์ด์' ํญ์ ์ต์์ ๊ฐ์ค์น๋ก ์ฐ๊ฒฐ๋๋ ์ ๋ถ์ด๋ค
// ๊ทธ๋ํ G์์ ์์์ ์ p๋ฅผ ์์์ ์ผ๋ก ์ ํํ๊ณ , D[p] = 0์ผ๋ก ๋๋๋ค.
// ๋ฐฐ์ด D[v]๋ T์ ์๋ ์ u์ v๋ฅผ ์ฐ๊ฒฐํ๋ ์ ๋ถ์ ์ต์ ๊ฐ์ค์น๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ์์์ด๋ค.
for (์ p๊ฐ ์๋ ์ v์ ๋ํ์ฌ) { // ๋ฐฐ์ด D์ ์ด๊ธฐํ
if (์ ๋ถ (p,v)๊ฐ ๊ทธ๋ํ์ ์์ผ๋ฉด)
D[v] = ์ ๋ถ (p,v)์ ๊ฐ์ค์น
else
D[v] = ๋ฌดํ๋
}
T={p} //์ด๊ธฐ์ ํธ๋ฆฌ T๋ ์ p๋ง์ ๊ฐ์ง๋ค.
while(T์ ์๋ ์ ์ ์ < n){
// T์ ์ํ์ง ์์ ๊ฐ ์ v์ ๋ํ์ฌ, D[v]๊ฐ ์ต์์ธ ์ v(min)๊ณผ ์ฐ๊ฒฐ๋ ์ ๋ถ(u,v(min))์ T์ ์ถ๊ฐํ๋ค.
// ๋จ, u๋ T์ ์ํ ์ ์ด๊ณ , ์ v(min)๋ T์ ์ถ๊ฐ๋๋ค.
for(T์ ์ํ์ง ์์ ๊ฐ ์ w์ ๋ํด์){
if(์ ๋ถ(v(min), w)์ ๊ฐ์ค์น < D[w])
D[w] = ์ ๋ถ(v(min), w)์ ๊ฐ์ค์น // D[w]๋ฅผ ๊ฐฑ์
}
}
return T // T๋ ์ต์ ์ ์ฅ ํธ๋ฆฌ์ด๋ค.
โํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ์ด ์ต์ข ์ ์ผ๋ก ๋ฆฌํดํ๋ T์๋ ์ ์ฌ์ดํด์ด ์์๊น?
- ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ์ ํญ์ T๋ฐ์ ์๋ ์ ์ ์ถ๊ฐํ๋ฏ๋ก ์ฌ์ดํด์ด ํ์ฑ๋์ง ์๋๋ค.
โํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ์ด ํญ์ MST๋ฅผ ์์ฑํ๋ ์ด์ ?
- ํญ์ T๋ฐ์ ์๋ ์ ์ ์ถ๊ฐํ๊ณ , ๊ฐ์ฅ ์์ ๊ฐ์ ๊ฐฑ์ ์ผ๋ก ์ด๋ฃจ์ด์ง ๊ฐ์ค์น์ ์ต์ ์ ๋ ฌ๋๋ก T์ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ!?
๐กํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ๋ณต์ก๋
- while๋ฃจํ๊ฐ (n-1)๋ฒ ๋ฐ๋ณต๋๊ณ , 1ํ ๋ฐ๋ณต๋ ๋, T์ ์ํ์ง ์์ ๊ฐ ์ v์ ๋ํ์ฌ, D[v]๊ฐ ์ต์์ธ ์ v(min)์ ์ฐพ๋๋ฐ O(n) ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
- 1์ฐจ์ ๋ฐฐ์ด D์์ (ํ์ฌ T์ ์ํ์ง ์์ ์ ๋ค์ ๋ํด์) ์ต์๊ฐ์ ์ฐพ๋ ๊ฒ์ด๊ณ , ๋ฐฐ์ด์ ํฌ๊ธฐ๋ ๊ทธ๋ํ์ ์ ์ ์์ธ n์ด๊ธฐ ๋๋ฌธ
- ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋ : (n-1)xO(n) = O(n^2)
// Setting ๊ณผ์ ์๋ต
while(T์ ์๋ ์ ์ ์ < n){ // O(n). ๋งค๋ฒ edge ํ๊ฐ์ฉ ์ถ๊ฐ. ์ด n-1๊ฐ
// T์ ์ํ์ง ์์ ๊ฐ ์ v์ ๋ํ์ฌ, D[v]๊ฐ ์ต์์ธ ์ v(min)๊ณผ ์ฐ๊ฒฐ๋ ์ ๋ถ(u,v(min))์ T์ ์ถ๊ฐํ๋ค.
// ๋จ, u๋ T์ ์ํ ์ ์ด๊ณ , ์ v(min)๋ T์ ์ถ๊ฐ๋๋ค.
for(T์ ์ํ์ง ์์ ๊ฐ ์ w์ ๋ํด์){
if(์ ๋ถ(v(min), w)์ ๊ฐ์ค์น < D[w])
D[w] = ์ ๋ถ(v(min), w)์ ๊ฐ์ค์น // O(n)
}
}
return T // T๋ ์ต์ ์ ์ฅ ํธ๋ฆฌ์ด๋ค.
โฐ๊ณต๋ถ ๊ธฐ๋ก
๐กํฌ๋ฆฌ์ค์ปฌ ์๊ณ ๋ฆฌ์ฆ vs ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ
ํฌ๋ฆฌ์ค์ปฌ ์๊ณ ๋ฆฌ์ฆ
- ์ ๋ถ์ด 1๊ฐ์ฉ T์ ์ถ๊ฐ๋๋๋ฐ, ์ด๋ ๋ง์น n๊ฐ์ ์ ๋ค์ด ๊ฐ๊ฐ์ ํธ๋ฆฌ์ธ ์ํ์์ ์ ๋ถ์ด ์ถ๊ฐ๋๋ฉด 2๊ฐ์ ํธ๋ฆฌ๊ฐ 1๊ฐ์ ํธ๋ฆฌ๋ก ํฉ์ณ์ง๋ ๊ฒ๊ณผ ๊ฐ๋ค.
- ์ด๋ฅผ ๋ฐ๋ณตํ์ฌ 1๊ฐ์ ํธ๋ฆฌ์ธ T๋ฅผ ๋ง๋ ๋ค. ์ฆ, n๊ฐ์ ํธ๋ฆฌ๋ค์ด ์ ์ฐจ ํฉ์ณ์ ธ์ 1๊ฐ์ ์ ์ฅ ํธ๋ฆฌ๊ฐ ๋ง๋ค์ด์ง๋ค.
ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ
- T๊ฐ ์ 1๊ฐ์ธ ํธ๋ฆฌ์์ ์์๋์ด, ์ ๋ถ์ 1๊ฐ์ฉ ์ถ๊ฐ์ํจ๋ค. ์ฆ, 1๊ฐ์ ํธ๋ฆฌ๊ฐ ์๋ผ๋์ ์ ์ฅํธ๋ฆฌ๊ฐ ๋๋ค.
์ต์์ ์ฅํธ๋ฆฌ ์์ฉ
- ์ต์ ๋น์ฉ์ผ๋ก ์ ๋ก ๋๋ ํ์ดํ ๋คํธ์ํฌ๋ฅผ ์ค์นํ๋๋ฐ ํ์ฉ
- ์ฌํ์ ๋ฌธ์ ๋ฅผ ๊ทผ์ฌ์ ์ผ๋ก ํด๊ฒฐํ๋๋ฐ ์ด์ฉ
Reference
์์ธ๊ณผํ๊ธฐ์ ๋ํ๊ต ์ปดํจํฐ๊ณตํ๊ณผ ์๊ณ ๋ฆฌ์ฆ ์์
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Algorithm] ๋ถ๋ถ ๋ฐฐ๋ญ ๋ฌธ์ (0) | 2021.10.13 |
---|---|
[Algorithm] ์ต๋จ ๊ฒฝ๋ก ์ฐพ๊ธฐ : ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ (0) | 2021.10.11 |
[Algorithm] ์ต๊ทผ์ ์ ์ ์ ์๊ณ ๋ฆฌ์ฆ (Closest Pair) (0) | 2021.10.06 |
[Algorithm] ๊ทธ๋ฆฌ๋(Greedy) ์๊ณ ๋ฆฌ์ฆ (0) | 2021.10.06 |
[Algorithm] ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ (0) | 2021.10.06 |