❓문제설명
섬 연결하기
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🔍문제해석
어떤걸 풀어야 할까?
- n개의 섬 사이에 다리를 건설하는 비용(costs)이 주어질 때, 최소의 비용으로 모든 섬이 서로 통행 가능하도록 만들 때 필요한 최소 비용을 구하자
- int n과 이차원배열 costs이 주어진다.
- 양방향으로 이동 가능하고, 연결할 수 없는 섬은 주어지지 않는다.
🧐문제풀이
- 알고리즘 선택최소의 비용으로 모든 노드를 방문해야하기에 그리디알고리즘 > 프림 알고리즘 선택
* 프림 알고리즘
- 정의: 프림 알고리즘은 특정 그래프에서 최소 신장 트리(MST)를 찾기 위한 그리디 알고리즘의 일종. 그래프의 노드를 연결하는 간선 중에서 매 단계마다 최소 비용의 간선을 선택하여 트리를 확장함.
- 특징:
- 항상 연결된 그래프에서 작동하며, 모든 노드를 포함하는 트리를 생성한다.
- 매 단계에서 비용이 가장 낮은 간선을 선택함으로써 전체 비용을 최소화한다. 주로 우선순위 큐를 사용한다.
!제출코드
- 인접리스트를 생성하여 노드간 간선, 이동 cost를 저장한다.
- 도착 노드와 cost를 담을 클래스 생성한다.
- 우선순위 큐에 담겼을때의 정렬조건을 지정한다. (cost 오름차순)
- 간선정보를 담을 우선순위 큐와 방문 체크를 할 배열 생성한다.
- 0번노드 부터 방문
- 클래스에 지정한 정렬순서대로 queue의 원소 중 가장 cost가 적은 객체가 리턴된다.
- 이미 방문한 노드는 스킵하고, 처음 방문한 노드에 대해서만 cost를 더한다.
- 이동할 노드를 queue에 담는다.
- 계산된 cost 리턴
import java.util.*;
class Solution {
public static int solution(int n, int[][] costs) {
ArrayList<ArrayList<Bridge>> bridges = new ArrayList<>();
for (int i = 0; i < n; i++) {bridges.add(new ArrayList<>()); }
// (1)
for (int[] cost : costs) {
int from = cost[0], to = cost[1], c = cost[2];
bridges.get(from).add(new Bridge(to, c));
bridges.get(to).add(new Bridge(from, c));
}
// (4)
PriorityQueue<Bridge> pq = new PriorityQueue<>();
boolean[] visited = new boolean[n];
// (5)
int totalCost = 0;
visited[0] = true;
// (6)
for(Bridge bridge : bridges.get(0)) {
pq.offer(bridge);
}
while(!pq.isEmpty()) {
// (6)
Bridge bridge = pq.poll();
// (7)
if(!visited[bridge.to]){
visited[bridge.to] = true;
totalCost += bridge.cost;
for(Bridge next : bridges.get(bridge.to)) {
pq.offer(next);
}
}
}
// (8)
int answer = totalCost;
return answer;
}
}
// (2)
class Bridge implements Comparable<Bridge> {
int to;
int cost;
public Bridge(int to, int cost) {
this.to = to;
this.cost = cost;
}
// (3)
@Override
public int compareTo(Bridge o) {
return this.cost - o.cost;
}
}
728x90
반응형
'개발 공부 > 코딩테스트 연습' 카테고리의 다른 글
[프로그래머스 입문][자바] 진료순서 정하기 (0) | 2024.10.20 |
---|---|
[프로그래머스 Lv3][자바] 단속카메라 (0) | 2024.09.28 |
[프로그래머스 Lv3][자바] 가장 먼 노드 (1) | 2024.09.24 |
[프로그래머스 Lv4][자바] 도둑질 (0) | 2024.09.22 |
[프로그래머스 Lv3][자바] 야근 지수 (2) | 2024.09.19 |