일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- c
- java
- Spotify Api
- python
- MYSQL
- spring boot
- 회귀
- programmers
- 프로그래머스
- SECS-II
- 회원가입
- spotify
- Spring JPA
- 스포티파이
- SECS/GEM
- Spring
- SW Expert Academy
- SECS
- Baekjoon
- Gem
- 백준
- 비트겟
- modern c++
- Computer Science
- regression
- SWEA
- 파이썬
- 자바
- CS
- C++
Archives
- Today
- Total
비버놀로지
[Programmers 프로그래머스] 42861 섬 연결하기 (JAVA) 본문
728x90
https://programmers.co.kr/learn/courses/30/lessons/42861
문제 설명
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
'ALGORITM > JAVA' 카테고리의 다른 글
[Programmers 프로그래머스] 42895 N으로 표현 (JAVA) (0) | 2021.07.02 |
---|---|
[Programmers 프로그래머스] 43105 정수 삼각형 (JAVA) (0) | 2021.07.02 |
[Programmers 프로그래머스] 42884 단속카메라 (JAVA) (0) | 2021.07.02 |
[Programmers 프로그래머스] 42584 주식가격 (JAVA) (0) | 2021.07.01 |
[Programmers 프로그래머스] 43164 여행경로 (JAVA) (0) | 2021.07.01 |
Comments