비버놀로지

[Programmers 프로그래머스] 42861 섬 연결하기 (JAVA) 본문

ALGORITM/JAVA

[Programmers 프로그래머스] 42861 섬 연결하기 (JAVA)

KUNDUZ 2021. 7. 2. 13:27
728x90

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

 

코딩테스트 연습 - 섬 연결하기

4 [[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]] 4

programmers.co.kr

 

문제 설명

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

 

먼저 가중치를 기준으로 배열을 정렬해 줍니다.

그렇게 정렬된 배열을 이용을 해서 가중치가 가장 작은 것 부터 연결을 해줍니다.

그렇게 연결이 되게 되면, Parent 값을 두 수 중 작은 값으로 지정해 줍니다.

 

보통 왼쪽의 값이 작으므로 왼쪽의 값을 부모노드로 사용을 하게 됩니다.

이러한 방식으로 모든 costs를 확인해서 결과값을 찾아 내게 됩니다.

import java.util.Arrays;
import java.util.Comparator;

class Solution {
    private int[] findParent;	//부모배열
    public int solution(int n, int[][] costs) {
		Arrays.sort(costs, new Comparator<int[]>() {	//가중치를 기준으로 오름차순 정렬

			@Override
			public int compare(int[] o1, int[] o2) {
				if (o1[2] == o2[2]) {
					return o1[1] - o2[1];
				} else {
					return o1[2] - o2[2];
				}
			}
		});

		findParent = new int[n];
		for (int i = 0; i < findParent.length; i++) {	//시작은 자기자신이 부모
			findParent[i] = i;
		}

		int answer = 0;
		for (int i = 0; i < costs.length; i++) {	//출발지를 start, 도착지를 end
			int start = find(costs[i][0]);
			int end = find(costs[i][1]);
			if (start != end) { // 부모가 같지 않다면 연결이 안된 최솟값이므로
				findParent[end] = start; // 연결
				answer += costs[i][2];
			}
		}
		return answer;

    }
    	private int find(int child) {	//부모노드 값을 찾는 메서드
		if (findParent[child] == child) {
			return child;
		} else {
			return findParent[child] = find(findParent[child]);
		}
	}
}

 

 

728x90
Comments