💡Problem Solving/Programmers

[프로그래머스] 배달 (Java)

gom20 2021. 10. 20. 15:40

#문제

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


#풀이

다익스트라 알고리즘을 사용하면 풀 수 있다.

 

#소스코드

import java.util.*;

// 노드의 연결된 노드와 거리를 가짐
class Edge {
    int to; 
    int distance;
    
    public Edge(int to, int distance){
        this.to = to;
        this.distance = distance;
    }
}

// 시작 노드에서 특정 노드에 도착하기 까지 가능한 거리
class Info {
    int node; 
    int distance;
    
    public Info(int node, int distance){
        this.node = node;
        this.distance = distance;
    }
}


class Solution {
    public int solution(int N, int[][] road, int K) {
        int answer = 0;
        
        // 해당 노드까지의 최단 거리를 담을 배열 생성
        int[] dist = new int[N+1];
        Arrays.fill(dist, Integer.MAX_VALUE);        
        
        // 각 노드의 인접 노드 리스트를 넣어줄 배열 생성
        ArrayList<Edge>[] edges = new ArrayList[N+1];
        for(int i = 0; i <= N; i++){
            edges[i] = new ArrayList<Edge>();            
        }
        
        // 거리 정보를 넣어줄 힙 생성
        PriorityQueue<Info> pq = new PriorityQueue<Info>(new Comparator<Info>(){
            @Override
            public int compare(Info i1, Info i2){
                return i1.distance - i2.distance;
            }
        });
        
        // 데이터를 담는다.
        for(int i = 0; i < road.length; i++){
            for(int j = 0; j < 3; j++){
                edges[road[i][0]].add(new Edge(road[i][1], road[i][2]));
                edges[road[i][1]].add(new Edge(road[i][0], road[i][2]));
            }
        }
        
        // 1번 Node부터 시작
        dist[1] = 0;
        pq.offer(new Info(1, dist[1]));
        
        while(!pq.isEmpty()) { 
            Info info = pq.poll();  
            if(info.distance > dist[info.node]) continue;
            for(Edge adj : edges[info.node]){
                 if(info.distance + adj.distance < dist[adj.to]){
                     dist[adj.to] = info.distance + adj.distance;
                     pq.offer(new Info(adj.to, dist[adj.to]));
                 }
            }
        }
        
        for(int i = 1; i < dist.length; i++){
            if(dist[i] <= K) answer++;
        }
     
        return answer;
    }
}