[프로그래머스]섬 연결하기

1 분 소요

(lv3) 섬 연결하기

문제


기존에 최소 신장 트리 라는 개념은 얄팍하게나마 알고있었지만 문제로서는 처음 접했던 문제인 것 같다.
최소 신장 트리MST 라고도 불리는데 각 정점들과 연결 된 간선에 가중치가 있을 때 조건에 맞게 그래프를 이동하며 비용이 최소가 되는 트리를 만드는 방법이다. 이런 문제를 해결할 수 있는 방법에는

  • Kruskal 알고리즘 :탐욕적인(greedy) 방법을 이용하여 그래프의 모든 정점을 최소 비용으로 연결하는 최적해를 구하는 것
  • Prim 알고리즘 : 시작 정점에서부터 출발하여 ST(Spanning Tree) 집합을 단계적으로 확장해나가는 방법

이 두가지가 대표 적이다. 나는 이 문제를 크루스칼 알고리즘을 이용하여 풀어보았다.

문제 풀이

#include<iostream>
#include <string>
#include <vector>
#include<algorithm>

using namespace std;
//parents[i] 정점 i의 부모 정점을 보관
int parents[101];

bool compare(const vector<int> &a, const vector<int> &b) {
	return a[2] < b[2];
}
//최상위 부모를 찾는 함수
int find(int node) {
	//부모노드가 자기자신이면 현재 노드가 최상위 노드
	if (node == parents[node])return node;
	//아니라면 최상위 부모노드를 찾음
	else {
		parents[node] = find(parents[node]);
		return parents[node];
	}
}
int solution(int n, vector<vector<int>> costs) {
	int answer = 0;
	//처음에는 모두 자기자신이 부모노드
	for (int i = 0; i < n; i++) parents[i] = i;
	//가중치 오름차순 정렬
	sort(costs.begin(), costs.end(), compare);

	for (int i = 0; i < costs.size(); i++) {
		int start = find(costs[i][0]);
		int end = find(costs[i][1]);
		int cost = costs[i][2];

		//start와 end가 연결되어있지 않다면
		if (start != end) {
			//start의 부모를 end
			parents[start] = end;
			//간선의 가중치 누적
			answer += cost;
		}
	}
	
	return answer;
}

댓글남기기