알고리즘

프로그래머스 배달 (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;
    }
}