1번과 2번을 생각하고 집합을 사용하여 n개의 섬을 연결하려고 시도하였는데 반례가 있어 실패했다.

오답 코드
#include <string>
#include <vector>
#include <algorithm>
#include <tuple>
#include <set>
using namespace std;
int solution(int n, vector<vector<int>> costs) {
vector<tuple<int, int, int>> c;
for(auto v : costs) c.push_back({v[2], v[0], v[1]});
sort(c.begin(), c.end());
int answer = 0;
set<int> s;
for(int i = 0; i < c.size(); i++){
if(s.size() == n) break;
int cost = get<0>(c[i]);
int i1 = get<1>(c[i]);
int i2 = get<2>(c[i]);
if(s.find(i1) != s.end() && s.find(i2) != s.end()) continue;
s.insert(i1);
s.insert(i2);
answer += cost;
}
return answer;
}

#include <string>
#include <vector>
#include <algorithm>
#include <tuple>
using namespace std;
int find_parent(int x, vector<int>& parent) {
if (parent[x] == x) return x;
return parent[x] = find_parent(parent[x], parent);
}
bool unite(int a, int b, vector<int>& parent, vector<int>& rnk) {
a = find_parent(a, parent);
b = find_parent(b, parent);
if (a == b) return false;
if (rnk[a] < rnk[b]) swap(a, b);
parent[b] = a;
if (rnk[a] == rnk[b]) rnk[a]++;
return true;
}
int solution(int n, vector<vector<int>> costs) {
vector<tuple<int, int, int>> edges;
for(auto v : costs) edges.push_back({v[2], v[0], v[1]});
sort(edges.begin(), edges.end());
vector<int> parent(n), rnk(n, 0);
for (int i = 0; i < n; i++) parent[i] = i;
int answer = 0;
int picked = 0;
for (auto &e : edges) {
int cost = get<0>(e), u = get<1>(e), v = get<2>(e);
if (unite(u, v, parent, rnk)) {
answer += cost;
picked++;
if (picked == n - 1) break;
}
}
return answer;
}