[프로그래머스/level 3] 섬 연결하기 - 42861

2024. 11. 19. 22:40·코딩 테스트 정복기/프로그래머스
반응형

[level 3] 섬 연결하기 - 42861

문제 링크

성능 요약

메모리: 72.3 MB, 시간: 0.76 ms

구분

코딩테스트 연습 > 탐욕법(Greedy)

채점결과

정확성: 100.0
합계: 100.0 / 100.0

제출 일자

2024년 11월 14일 02:17:48

문제 설명

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의 비용이 주어지지 않습니다.
  • 모든 섬 사이의 다리 건설 비용이 주어지지 않습니다. 이 경우, 두 섬 사이의 건설이 불가능한 것으로 봅니다.
  • 연결할 수 없는 섬은 주어지지 않습니다.

입출력 예

n costs return
4 [[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]] 4

입출력 예 설명

costs를 그림으로 표현하면 다음과 같으며, 이때 초록색 경로로 연결하는 것이 가장 적은 비용으로 모두를 통행할 수 있도록 만드는 방법입니다.

image.png

출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges

제출코드

import java.util.*;
class Solution {
    int[] parent; // 부모 노드 정보
    // root 찾기
    int findRoot(int a){
        if(parent[a] == a){
            return a;
        }
        return parent[a] = findRoot(parent[a]); // 경로 압축
    }

    // 두 집합 합치기
    void union(int a, int b){
        int rootA = findRoot(a);
        int rootB = findRoot(b);
        parent[rootA] = rootB;
    }

    public int solution(int n, int[][] costs) {
        // parent 초기화
        this.parent = new int[n];
        for(int i=0; i<n; i++){parent[i] = i;}

        // cost
        Arrays.sort(costs, (o1, o2) ->o1[2]-o2[2]);
        int cnt = 0, answer = 0;
        for(int[] cost : costs){
            if(cnt == n-1){ // 간선 수가 채워지면
                break;
            }
            // 주어진 두 다리 잇기: 서로 다른 집합일 경우에 이어줌
            if(findRoot(cost[0]) != findRoot(cost[1])){
                union(cost[0], cost[1]); // 간선 이어주기
                answer += cost[2]; // 비용 추가
                cnt++; // 간선 +1 
            }

        }


        return answer;
    }
}
728x90
반응형

'코딩 테스트 정복기 > 프로그래머스' 카테고리의 다른 글

[프로그래머스/level 2] 미로 탈출 - 159993  (0) 2024.11.25
[프로그래머스/level 2] 게임 맵 최단거리 - 1844  (2) 2024.11.24
[프로그래머스/level 2] 영어 끝말잇기 - 12981  (1) 2024.11.18
[프로그래머스/level 3] 다단계 칫솔 판매 - 77486  (0) 2024.11.16
[프로그래머스/level 2] 예상 대진표 - 12985  (4) 2024.11.15
'코딩 테스트 정복기/프로그래머스' 카테고리의 다른 글
  • [프로그래머스/level 2] 미로 탈출 - 159993
  • [프로그래머스/level 2] 게임 맵 최단거리 - 1844
  • [프로그래머스/level 2] 영어 끝말잇기 - 12981
  • [프로그래머스/level 3] 다단계 칫솔 판매 - 77486
settong
settong
    250x250
  • settong
    개 발 자 국
    settong
  • 전체
    오늘
    어제
    • 전체보기 (202)
      • Computer Science (50)
        • Network (7)
        • Operating System (18)
        • Data Structure (9)
        • Database (11)
        • Algorithm (5)
      • Language (17)
        • Java (17)
        • Javascript (0)
        • Python (0)
      • Devops (20)
        • AWS (0)
        • Naver Cloud (16)
        • CICD (3)
        • 웹 서버 관리 (1)
      • Front (0)
        • React (0)
      • Backend (5)
        • Spring (5)
      • 코딩 테스트 정복기 (110)
        • 백준 (51)
        • 프로그래머스 (53)
        • 기타 (6)
      • etc (0)
      • 경제 상식 (0)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    Spring Boot
    BFS
    완전탐색
    DFS
    집합
    벨만포드
    ncp200
    백준
    다이나믹프로그래밍
    ncp202
    Network
    github actions
    백트래킹
    분할정복
    ncp
    다익스트라
    CI/CD
    해시
    프로그래머스
    lcs
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
settong
[프로그래머스/level 3] 섬 연결하기 - 42861
상단으로

티스토리툴바