[프로그래머스 알고리즘 고득점 Kit][그리디][Java] 섬 연결하기

2026. 8. 15. 18:33·알고리즘 & 자료구조/문제 풀이

https://school.programmers.co.kr/learn/courses/30/lessons/42861

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

크루스칼 알고리즘을 사용해 최소 신장 트리를 만든다.

  1. 모든 다리를 비용 기준으로 오름차순 정렬한다.
  2. 비용이 작은 다리부터 확인한다.
  3. 두 섬의 대표가 다르면 사이클이 발생하지 않으므로 연결한다.
  4. 해당 다리의 비용을 minCost에 더하고 두 집합을 합친다.

Union-Find

  • find(): 섬이 속한 집합의 대표를 찾고 경로를 압축한다.
  • union(): 서로 다른 두 집합을 하나로 합친다.
  • p[x] < 0이면 x가 해당 집합의 대표이다.

시간복잡도

  • 다리 정렬: O(E log E)
  • Union-Find: 약 O(E)
  • 전체: O(E log E)
import java.util.*;

class Solution {
    
    int N; //섬의 개수
    int[] p;
    ArrayList<Bridge> bridges;
    class Bridge {
        int u;
        int v;
        int c;
        Bridge(int u, int v, int c) {
            this.u = u;
            this.v = v;
            this.c = c;
        }
    }
    
    public int solution(int n, int[][] costs) {
        N = n;
        p = new int[N+1];
        Arrays.fill(p, -1);
        bridges = new ArrayList<>();
        
        for(int i=0; i<costs.length; i++) {
            int u = costs[i][0];
            int v = costs[i][1];
            int c = costs[i][2];
            
            bridges.add(new Bridge(u, v, c));
        }
        
        bridges.sort((b1, b2) -> {
            return Integer.compare(b1.c, b2.c);
        });
        
        int minCost = 0;
        for(Bridge bridge: bridges) {
            int u = bridge.u;
            int v = bridge.v;
            int c = bridge.c;
            
            if(find(u) != find(v)) {
                minCost += c;
                union(u, v);
            }
        }
        
        return minCost;
    }
    
    public int find(int x) {
        if(p[x] < 0) return x;
        
        return p[x] = find(p[x]);
    }
    
    public void union(int x, int y) {
        int u = find(x);
        int v = find(y);
        
        if(u == v) return;
        
        if(p[u] > p[v]) {
            int t = u;
            u = v;
            v = t;
        }
        if(p[u] == p[v]) p[u]--;
        
        p[v] = u;
    }
}

저작자표시 비영리 변경금지 (새창열림)

'알고리즘 & 자료구조 > 문제 풀이' 카테고리의 다른 글

[프로그래머스 알고리즘 고득점 Kit][그리디][Java] 구명보트  (0) 2026.08.14
[프로그래머스 알고리즘 고득점 Kit][그리디][Java] 큰 수 만들기  (1) 2026.08.10
[프로그래머스 알고리즘 고득점 Kit][힙(Heap)][Java] 디스크 컨트롤러  (0) 2026.08.05
[프로그래머스 알고리즘 고득점 Kit][그리디][Java] 조이스틱  (0) 2026.08.02
[프로그래머스 알고리즘 고득점 Kit][스택/큐][Java] 주식가격  (0) 2026.07.29
'알고리즘 & 자료구조/문제 풀이' 카테고리의 다른 글
  • [프로그래머스 알고리즘 고득점 Kit][그리디][Java] 구명보트
  • [프로그래머스 알고리즘 고득점 Kit][그리디][Java] 큰 수 만들기
  • [프로그래머스 알고리즘 고득점 Kit][힙(Heap)][Java] 디스크 컨트롤러
  • [프로그래머스 알고리즘 고득점 Kit][그리디][Java] 조이스틱
수수다
수수다
우하하
  • 수수다
    그냥살자
    수수다
  • 전체
    오늘
    어제
    • 분류 전체보기 (92)
      • 프로젝트 (2)
      • 알고리즘 & 자료구조 (49)
        • 내용 정리 (2)
        • 문제 풀이 (47)
      • 데이터베이스 (37)
        • 내용 정리 (1)
        • 문제 풀이 (36)
      • CS (2)
      • 기타 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 네이버 블로그
  • 공지사항

  • 인기 글

  • 태그

    분리집합
    union-find
    Java
    알고리즘
    완전탐색
    DP
    Round
    date_format
    dfs
    Stack
    유니온파인드
    그래프
    mysql
    깊이/너비 우선 탐색(DFS/BFS)
    코테
    백트래킹
    IFNULL
    coalesce
    이분탐색
    SQL
    bfs
    Lv2
    정렬
    SUBSTR
    AVG
    코딩테스트
    동적계획법
    프로그래머스 알고리즘 고득점 kit
    프로그래머스
    해시
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
수수다
[프로그래머스 알고리즘 고득점 Kit][그리디][Java] 섬 연결하기
상단으로

티스토리툴바