쫑쫑이의 블로그

백준 1916 최소비용 구하기 Java [다익스트라] 본문

알고리즘/백준

백준 1916 최소비용 구하기 Java [다익스트라]

쫑쫑2 2022. 10. 20. 01:43

https://www.acmicpc.net/problem/1916

 

1916번: 최소비용 구하기

첫째 줄에 도시의 개수 N(1 ≤ N ≤ 1,000)이 주어지고 둘째 줄에는 버스의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 M+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그

www.acmicpc.net

 

다익스트라 알고리즘을 사용해서 풀면 된다

끝까지 돌 필요 없이 도착 도시에 최초로 방문할 때 break해준다

 

import java.io.*;
import java.util.*;


public class Main {
    static final int INF = 200_000_000;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int M = Integer.parseInt(br.readLine());
        boolean[] vtd = new boolean[N+1];
        List<int[]>[] nodes = new ArrayList[N+1];
        for (int n = 0; n <= N; n++) {
            nodes[n] = new ArrayList<>();
        }
            int[] distance = new int[N+1];
        Arrays.fill(distance, INF);
        for (int m = 0; m < M; m++) {
            int[] arr = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
            nodes[arr[0]].add(new int[]{arr[1], arr[2]});
        }


        int[] arr = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        int start = arr[0];
        int end = arr[1];
        PriorityQueue<int[]> queue = new PriorityQueue<>(Comparator.comparingInt(o -> o[1]));
        queue.add(new int[]{start, 0});
        distance[start] = 0;

        while(!queue.isEmpty()) {
            int[] now = queue.poll();
            if (now[0] == end) {
                System.out.println(now[1]);
                break;
            }
            if (vtd[now[0]]) continue;
            vtd[now[0]] = true;
            for (int[] value : nodes[now[0]]) {
                if (distance[value[0]] > now[1] + value[1]) {
                    distance[value[0]] = now[1] + value[1];
                    queue.add(new int[]{value[0], distance[value[0]]});
                }
            }
        }
    }
}
피드백

nodes 리스트에 Arrays.fill(nodes, new int[]{}) 를 사용하니까 모두 같은 주소값으로 초기화되어 다시 하나씩 넣어줬다

우선순위큐 비교 연산을 자동완성에 의지하고 있는데 코테를 위해 공부해야할 필요성이 느껴진다

비슷한 문제 (1753번) 풀때 List 대신 HashMap을 사용하니까 시간초과가 떠서 이번엔 처음부터 List를 사용해서 풀었다

 

자료구조별 성능 비교를 해둔 블로그를 보고 List를 사용했다

https://12bme.tistory.com/91 

 

[자바성능] 자료형 성능 비교

일반적인 프로젝트에서 VO객체 패턴을 많이 사용합니다. 그 객체 안에는 대부분 Collection이나 Map 등의 인터페이스를 상속받는 객체가 많이 사용됩니다. 대부분 목록 데이터를 가장 담기 좋은 것

12bme.tistory.com