๋ฐ์ํ
https://programmers.co.kr/learn/courses/30/lessons/42861?language=java
๋ฌธ์
n๊ฐ์ ์ฌ ์ฌ์ด์ ๋ค๋ฆฌ๋ฅผ ๊ฑด์คํ๋ ๋น์ฉ(costs)์ด ์ฃผ์ด์ง ๋, ์ต์์ ๋น์ฉ์ผ๋ก ๋ชจ๋ ์ฌ์ด ์๋ก ํตํ ๊ฐ๋ฅํ๋๋ก ๋ง๋ค ๋ ํ์ํ ์ต์ ๋น์ฉ์ return ํ๋๋ก solution์ ์์ฑํ์ธ์.
๋ค๋ฆฌ๋ฅผ ์ฌ๋ฌ ๋ฒ ๊ฑด๋๋๋ผ๋, ๋๋ฌํ ์๋ง ์์ผ๋ฉด ํตํ ๊ฐ๋ฅํ๋ค๊ณ ๋ด ๋๋ค. ์๋ฅผ ๋ค์ด A ์ฌ๊ณผ B ์ฌ ์ฌ์ด์ ๋ค๋ฆฌ๊ฐ ์๊ณ , B ์ฌ๊ณผ C ์ฌ ์ฌ์ด์ ๋ค๋ฆฌ๊ฐ ์์ผ๋ฉด A ์ฌ๊ณผ C ์ฌ์ ์๋ก ํตํ ๊ฐ๋ฅํฉ๋๋ค.
์ ํ ์ฌํญ
- ์ฌ์ ๊ฐ์ n์ 1 ์ด์ 100 ์ดํ์ ๋๋ค.
- costs์ ๊ธธ์ด๋ ((n-1) * n) / 2์ดํ์ ๋๋ค.
- ์์์ i์ ๋ํด, costs[i][0] ์ costs[i] [1]์๋ ๋ค๋ฆฌ๊ฐ ์ฐ๊ฒฐ๋๋ ๋ ์ฌ์ ๋ฒํธ๊ฐ ๋ค์ด์๊ณ , costs[i] [2]์๋ ์ด ๋ ์ฌ์ ์ฐ๊ฒฐํ๋ ๋ค๋ฆฌ๋ฅผ ๊ฑด์คํ ๋ ๋๋ ๋น์ฉ์ ๋๋ค.
- ๊ฐ์ ์ฐ๊ฒฐ์ ๋ ๋ฒ ์ฃผ์ด์ง์ง ์์ต๋๋ค. ๋ํ ์์๊ฐ ๋ฐ๋๋๋ผ๋ ๊ฐ์ ์ฐ๊ฒฐ๋ก ๋ด ๋๋ค. ์ฆ 0๊ณผ 1 ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํ๋ ๋น์ฉ์ด ์ฃผ์ด์ก์ ๋, 1๊ณผ 0์ ๋น์ฉ์ด ์ฃผ์ด์ง์ง ์์ต๋๋ค.
- ๋ชจ๋ ์ฌ ์ฌ์ด์ ๋ค๋ฆฌ ๊ฑด์ค ๋น์ฉ์ด ์ฃผ์ด์ง์ง ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ, ๋ ์ฌ ์ฌ์ด์ ๊ฑด์ค์ด ๋ถ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ๋ด ๋๋ค.
- ์ฐ๊ฒฐํ ์ ์๋ ์ฌ์ ์ฃผ์ด์ง์ง ์์ต๋๋ค.
ํ์ด
Prim ์๊ณ ๋ฆฌ์ฆ
์ผ๋ก ํด๊ฒฐ โผ๏ธ
https://hyeyun.tistory.com/entry/Algorithm-์๊ณ ๋ฆฌ์ฆ-Prims-Algorithm-ํ๋ฆผ-์๊ณ ๋ฆฌ์ฆ
์ฝ๋
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
public class ์ฌ์ฐ๊ฒฐํ๊ธฐ {
static class bridge implements Comparable<bridge>{
int start;
int destination;
int cost;
bridge(int start, int destination, int cost){
this.start = start;
this.destination = destination;
this.cost = cost;
}
@Override
public int compareTo(bridge o) {
return this.cost - o.cost;
}
}
static ArrayList<bridge> adj[];
static ArrayList<bridge> mst;
static boolean[] isVisited;
public static int solution(int n, int[][] costs) {
int answer = 0;
adj = new ArrayList[n];
mst = new ArrayList<>();
isVisited = new boolean[n];
for(int i = 0 ; i < n; i++){
adj[i] = new ArrayList<>();
}
for(int[] c : costs){
adj[c[0]].add(new bridge(c[0], c[1], c[2]));
adj[c[1]].add(new bridge(c[1], c[0], c[2]));
}
PriorityQueue<bridge> pq = new PriorityQueue<>();
Queue<Integer> queue = new LinkedList<>();
queue.offer(0);
mst.add(new bridge(-1, 0, 0));
isVisited[0] = true;
while(!queue.isEmpty()){
int now = queue.poll();
for(bridge b : adj[now]){
if(!isVisited[b.destination])
pq.offer(b);
}
while(!pq.isEmpty()){
bridge b = pq.poll();
if(!isVisited[b.destination]){
queue.add(b.destination);
isVisited[b.destination] = true;
mst.add(b);
answer += b.cost;
break;
}
}
}
return answer;
}
public static void main(String[] args) {
int[][] costs = {{0,1,1}, {0,2,2}, {1,2,5}, {1,3,1}, {2,3,8}};
System.out.println(solution(4, costs));
}
}
728x90
๋ฐ์ํ