티스토리 뷰
프로그래머스 42861번 - 섬 연결하기
요구사항
1. 최소의 비용으로 모든 섬이 서로 통행 가능하도록 만들 때 필요한 최소 비용을 반환하라.
2. A 섬과 B 섬 사이에 다리가 있고, B 섬과 C 섬 사이에 다리가 있으면 A 섬과 C 섬은 서로 통행 가능합니다.
요구사항 분석 및 풀이과정
1. 이 문제는 전형적인 최소 스패닝 트리 문제입니다. 최소 스패닝 트리 문제는 크루스칼 알고리즘 또는 프림 알고리즘으로 해결 가능합니다.
2. 저는 서로소 집합(Union-Find)을 이용한 크루스칼 알고리즘을 사용할 할 것입니다. 크루스칼 알고리즘에 대해서는 따로 설명하지 않겠습니다.
3. 섬 사이에 다리를 건설하는 비용을 기준으로 내림차순 정렬하여, 비용이 적은 다리부터 사이클이 형성되지 않도록 N - 1 개의 다리를 선택하면 모든 섬이 서로 통행 가능하도록 연결할 수 있습니다.
소스코드 작성
import java.util.Arrays;
import java.util.Comparator;
class Solution {
private static class Dsu {
private final int[] parent;
public Dsu(int size) {
this.parent = new int[size];
for (int i = 0; i < size; i++) {
parent[i] = i;
}
}
public int find(int x) {
if (parent[x] == x) {
return x;
}
parent[x] = find(parent[x]);
return parent[x];
}
public boolean union(int x, int y) {
int parentX = find(x);
int parentY = find(y);
if (parentX == parentY) {
return false;
}
parent[parentY] = parentX;
return true;
}
}
public int solution(int n, int[][] costs) {
Arrays.sort(costs, Comparator.comparingInt(cost -> cost[2]));
Dsu d = new Dsu(n);
int result = 0;
int count = 0;
for(int[] cost : costs) {
if (count == n-1) {
break;
}
if (d.union(cost[0], cost[1])) {
result += cost[2];
count++;
}
}
return result;
}
}
결과
소스코드 깃허브 주소
'코딩테스트 > 알고리즘' 카테고리의 다른 글
[알고리즘]프로그래머스 43105번 - 정수 삼각형 (0) | 2022.01.17 |
---|---|
[알고리즘]프로그래머스 42898번 - 등굣길 (0) | 2022.01.17 |
[알고리즘]프로그래머스 42577번 - 전화번호 목록 (0) | 2022.01.16 |
[알고리즘]프로그래머스 49189번 - 가장 먼 노드 (0) | 2022.01.16 |
[알고리즘]프로그래머스 43162번 - 네트워크 (0) | 2022.01.16 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 구현
- BFS
- 정렬
- sql
- 프로그래머스
- 카카오
- Uber
- dfs
- 스택
- 문자열
- 비트연산
- 스트림
- 알고리즘
- 우선순위큐
- 해쉬
- dsu
- 연결리스트
- 회고
- 코드 스니펫
- 쓰레드
- k8s
- JPA
- TDD
- kotlin
- 탐욕법
- Java
- 오늘의집
- dp
- 코딩인터뷰
- set
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함