알고리즘
프로그래머스 배달 (JAVA)
박카스마시며코딩
2022. 5. 24. 15:48
https://programmers.co.kr/learn/courses/30/lessons/12978
코딩테스트 연습 - 배달
5 [[1,2,1],[2,3,3],[5,2,2],[1,4,2],[5,3,1],[5,4,2]] 3 4 6 [[1,2,1],[1,3,2],[2,3,2],[3,4,3],[3,5,2],[3,5,3],[5,6,1]] 4 4
programmers.co.kr
저는 해당 문제를 다익스트라를 이용해 문제를 해결하였습니다.
다익스트라를 통해 1번부터 각 점에 대해 최소 거리를 구하였습니다.
저는 다익스트라를 진행하면서 연결되어 있지 않거나 최소 길이가 k초과가 된다면 바로 리턴하도록 하였습니다.
package Programmers.ETC;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class 배달 {
private static class Edge{
int end;
int weight;
public Edge(int end,int weight){
this.end = end;
this.weight = weight;
}
}
public int solution(int n, int[][] roads, int k) {
List<Edge>[] edges = new List[n+1];
for(int i = 1 ; i <= n ; i++){
edges[i] = new ArrayList<>();
}
for(int[] road : roads){
edges[road[0]].add(new Edge(road[1],road[2]));
edges[road[1]].add(new Edge(road[0],road[2]));
}
int answer = dij(edges,n,k);
return answer;
// return 0;
}
private static final int INF = 987654321;
private static int dij(List<Edge>[] edges,int n, int k){
boolean[] visited = new boolean[n+1];
int[] distance = new int[n+1];
Arrays.fill(distance,INF);
distance[1] = 0;
int result = 0;
for(int i = 0 ; i < n ; i++){
int minIndex = 0;
int minValue = INF;
for(int j = 1 ; j <= n ; j++){
if(!visited[j] && minValue > distance[j]){
minValue = distance[j];
minIndex = j;
}
}
if(minValue == INF || minValue > k){
return result;
}
visited[minIndex] = true;
result++;
for(Edge edge : edges[minIndex]){
if(!visited[edge.end] && minValue + edge.weight < distance[edge.end]){
distance[edge.end] = minValue + edge.weight;
}
}
}
return result;
}
}