728x90
    
    
  1. 메인 메서드
	public int solution(int n , int[][] costs){
    
    	int answer = 0;
        
        //cost 오름차순 정렬 
        Arrays.sort(costs,(o1,o2 -> o1[2] - o2[2]);
        
        //부모 노드 초기화 
        int[] parent = new int[n]; 
        for(int i=0; i<parent.length; i++) {
        	parent[i] = i;
        }
        
        answer = kruskal(costs, parent);
        return answer;
    }
2. 크루스칼 메서드
public static int kruskal(int[][] costs, int[] parent){
	int cost = 0; 
    
    for(int i = 0; i < costs.length; i++) {
    
    	//첫번째 섬과 두번째 섬의 부모가 다를 때 
    	if(find(parent, costs[i][0]) != find(parent, costs[i][1])){
        	cost += costs[i][2];
            union(parent, costs[i][0], costs[i][1]);
        }
    
    }
	return cost;
    
}
3. x의 부모를 찾는 find 메서드
public static int find(int[] parent , int x){
	if(parent[x] == x) return x;
    else return find(parent, parent[x]);
}
4. x와 y그래프를 합치는 union 메서드
public static void union(int[] parent, int x, int y){
	x = find(parent, x); //부모 노드 찾기?
    y = find(parent, y);
    if(x < y) parent[y] = x;
    else parent[x] = y;
}
노드 번호가 작은 쪽이 부모가 되도록 한다.
최종 코드
import java.util.*;
class Solution {
	public int solution(int n, int[][] costs){
    
    	int answer = 0;
        
        //costs 의 비용 부분 기준으로 오름차순 정렬
        Arrays.sort(costs, (o1,o2) -> o1[2] - o2[2]);
        
        //부모 노드 초기화 
        int[] parent = new int[n+1];
        
        for(int i=0; i < parent.length ; i++) {
        	parent[i] = i;
        }
        
        answer = kruskal(costs, parent);
        return answer;
    }
    
    public static int kruskal(int[][] costs, int[] parent){
    
    	int cost = 0;
        
        for(int i = 0; i < costs.length; i++) {
        	
            if(find(parent, costs[i][0]) != find(parent, costs[i][1])){
            	cost += costs[i][2];
                union(parent, costs[i][0], costs[i][1]);
            }
        }
        
        return cost;
    
    }
    
    public static int find(int[] parent, int x){
    	if(parent[x] == x) return x;
        else return find(parent, parent[x]);
    }
	public static void union(int[] parent, int x, int y){
    	x = find(parent, x);
        y = find(parent, y);
        if( x<y ) parent[y] = x;
        else parent[x] = y;
    }
    
}
진짜 정리 잘했다고 느꼈던 참고한 블로그 :
[알고리즘/Java] 유니온 파인드(Union-Find) 알고리즘
✔ 목차 유니온 파인드란? 유니온 파인드 예시 유니온 파인드 구현 - Java 🔎 유니온 파인드란? 🔎 유니온 파인드 예시 💻 유니온 파인드 구현 - Java
velog.io
728x90
    
    
  'CodingTest' 카테고리의 다른 글
| 프로그래머스 동적계획법(Dynamic Programming) N으로 표현 자바 (0) | 2025.03.05 | 
|---|---|
| 프로그래머스 코딩테스트 연습 탐욕법(Greedy) 단속카메라 JAVA (1) | 2025.03.05 | 
| 프로그래머스 코딩테스트 연습 탐욕법 구명보트 JAVA (1) | 2025.03.04 | 
| 탐욕법 조이스틱 자바 (0) | 2025.02.25 | 
| 프로그래머스 탐욕법 체육복 자바 (1) | 2025.02.25 | 
댓글