프로그래머스 3단계 : 섬 연결하기 (Java 자바)

2023. 9. 6. 20:02·💻 코딩테스트/programmers
728x90

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

 


입출력 예

 

 

풀이

Kruskal 알고리즘을 사용하여 최소 비용으로 모든 섬을 연결하는 문제를 해결하는 Java 프로그램입니다. Kruskal 알고리즘은 최소 스패닝 트리를 찾는 알고리즘 중 하나로, 이 문제에서는 최소 비용으로 모든 섬을 연결하는 최적의 다리 건설 방법을 찾아냅니다.

 

int[] parent: 각 섬의 부모 노드를 저장하는 배열입니다. 이 배열은 나중에 연결된 다리들의 정보를 저장할 때 사용됩니다.

get_parent(int a): 각 섬의 부모 노드를 찾아주는 함수입니다. 부모 노드를 찾는 동시에 경로 압축(Path Compression)을 수행하여 성능을 향상시킵니다.

union(int a, int b): 두 섬을 연결하는 함수로, 두 섬의 부모 노드를 찾고 더 작은 번호의 섬을 부모로 설정합니다.

solution(int n, int[][] costs): 실제 문제를 해결하는 함수입니다. 아래의 단계로 진행됩니다.

parent 배열 초기화: 모든 섬을 처음에는 자신의 부모로 설정합니다.


costs 배열을 다리 건설 비용을 기준으로 오름차순으로 정렬합니다.

 

정렬된 costs 배열을 순회하면서 다음을 수행합니다.

 

현재 다리를 연결하는 두 섬의 부모가 같은지 확인합니다. 같다면 이미 연결되어 있는 상태이므로 스킵합니다.
다른 경우, 두 섬을 연결하고 해당 다리 건설 비용을 answer에 추가합니다.

 

import java.util.*;

class Solution {
    public int[] parent; // 각 섬의 부모 노드를 저장하는 배열

    // 부모 노드를 찾는 함수
    public int get_parent(int a) {
        if (a == parent[a])
            return parent[a];
        else
            return parent[a] = get_parent(parent[a]); // 경로 압축
    }

    // 두 섬을 연결하는 함수
    public void union(int a, int b) {
        a = get_parent(a);
        b = get_parent(b);
        if (a > b)
            parent[a] = b;
        else
            parent[b] = a;
    }

    public int solution(int n, int[][] costs) {
        int answer = 0; // 최소 비용을 저장할 변수
        parent = new int[n]; // 부모 노드 배열 초기화

        // 각 섬을 처음에는 자신의 부모로 설정
        for (int i = 0; i < parent.length; parent[i] = i++);

        // 다리 건설 비용을 기준으로 costs 배열을 오름차순으로 정렬
        Arrays.sort(costs, new Comparator<>() {
            @Override
            public int compare(int[] a, int[] b) {
                if (a[2] > b[2])
                    return 1;
                else
                    return -1;
            }
        });

        // 정렬된 costs 배열을 순회하면서 최소 스패닝 트리를 만듦
        for (int i = 0; i < costs.length; i++) {
            if (get_parent(costs[i][0]) == get_parent(costs[i][1]))
                continue; // 이미 연결되어 있는 경우 스킵
            union(costs[i][0], costs[i][1]); // 두 섬을 연결
            answer += costs[i][2]; // 다리 건설 비용 추가
        }
        return answer;
    }
}
728x90
저작자표시 비영리 변경금지 (새창열림)

'💻 코딩테스트 > programmers' 카테고리의 다른 글

프로그래머스 3단계 : 가장 긴 팰린드롬 (Java 자바)  (0) 2023.09.07
프로그래머스 3단계 : 입국심사 (Java 자바)  (0) 2023.09.06
프로그래머스 3단계 : 징검다리 건너기 (Java 자바)  (0) 2023.09.06
프로그래머스 3단계 : 불량 사용자 (Java 자바)  (0) 2023.09.06
프로그래머스 3단계 : 스티커 모으기(2) (Java 자바)  (0) 2023.09.06
'💻 코딩테스트/programmers' 카테고리의 다른 글
  • 프로그래머스 3단계 : 가장 긴 팰린드롬 (Java 자바)
  • 프로그래머스 3단계 : 입국심사 (Java 자바)
  • 프로그래머스 3단계 : 징검다리 건너기 (Java 자바)
  • 프로그래머스 3단계 : 불량 사용자 (Java 자바)
gxxg
gxxg
함께 일하고 싶은 개발자를 꿈꾸는 예비개발자의 공부 기록
  • gxxg
    공공
    gxxg
  • 전체
    오늘
    어제
    • 분류 전체보기 (138)
      • ☁️ 구름 x 카카오 Deep Dive 풀스택 (7)
        • html, css (1)
        • Java (3)
        • 스프링 MVC (0)
      • 💻 코딩테스트 (89)
        • 백준 (2)
        • programmers (87)
      • SQLD (1)
      • Language (3)
        • Java (2)
        • JavaScript (1)
      • Style Sheet (0)
        • CSS (0)
        • SCSS & SASS (0)
      • DBMS (2)
        • Oracle (2)
        • MySQL (0)
        • postgresql (0)
        • 데이터베이스 기초 이론 (0)
      • React (0)
      • SpringBoot (0)
      • JSP (2)
      • 알고리즘 (0)
      • 2023-02 몰입형 SW 정규 교육 (24)
        • 9월 프로젝트 (8)
      • 벽돌깨기 (4)
      • Etc (4)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    springboot
    티스토리챌린지
    코딩테스트
    3단계
    LV3
    javascript
    JSP
    이클립스
    프로젝트 구조
    코테
    HTML
    톰캣
    junit 테스트
    2단계
    오블완
    자바
    구현체
    Lv0
    Lv2
    eclipse
    spring
    프로그래머스
    CSS
    POST
    자바스크립트
    DFS
    java
    0단계
    programmers
    회원 관리 시스템
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gxxg
프로그래머스 3단계 : 섬 연결하기 (Java 자바)
상단으로

티스토리툴바