[프로그래머스/C++] 섬 연결하기
1.문제 링크
https://programmers.co.kr/learn/courses/30/lessons/42861
2. 풀이 전 계획과 생각
- 최소신장 트리 만들기
 
3. 풀이
#include <vector>
#include <algorithm>
using namespace std;
vector<pair<int, pair<int, int> > > edges;
int parent[101];
// 특정 원소가 속한 집합을 찾기  
int find_parent(int x){
	if(parent[x]!=x) return find_parent(parent[x]);
	return x;
}
// 두 원소가 속한 집합을 합치기  
void union_parent(int a, int b){
	a = find_parent(a);
	b = find_parent(b);
	if(a<b) parent[b]=a;
	else parent[a]=b;
}
int solution(int n, vector<vector<int>> costs) {
    
    for(int i=1;i<=n;i++){
		parent[i]=i;
	}
    
    for(int i=0;i<costs.size();i++){
        edges.push_back({costs[i][2],{costs[i][0],costs[i][1]}});
    }
    
    sort(edges.begin(), edges.end());
    
    int answer = 0;
    for (int i = 0; i < edges.size(); i++) {
        int cost = edges[i].first;
        int a = edges[i].second.first;
        int b = edges[i].second.second;
        // 사이클이 발생하지 않는 경우에만 집합에 포함
        if (find_parent(a) != find_parent(b)) {
            union_parent(a, b);
            answer += cost;
        }
    }
    return answer;
}
- 모든 입력을 edges 벡터에 삽입. {비용, {노드1, 노드2}} 형태로 삽입.
 - edges 벡터를 오름차순으로 정렬.
 - 크루스칼 알고리즘으로 최소신장 트리를 구함.
 
4. 풀이하면서 고민했던 점
- 없음
 
5. 문제를 풀고 알게된 개념 및 소감
- 크루스칼 알고리즘 구현을 복습함.