[백준 - 실버] 1446. 지름길

김도은·2025년 3월 13일

알고리즘-자바

목록 보기
13/19

이번 주의 문제

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

매일 아침, 세준이는 학교에 가기 위해서 차를 타고 D킬로미터 길이의 고속도로를 지난다. 이 고속도로는 심각하게 커브가 많아서 정말 운전하기도 힘들다. 어느 날, 세준이는 이 고속도로에 지름길이 존재한다는 것을 알게 되었다. 모든 지름길은 일방통행이고, 고속도로를 역주행할 수는 없다.

세준이가 운전해야 하는 거리의 최솟값을 출력하시오.

<입력>
첫째 줄에 지름길의 개수 N과 고속도로의 길이 D가 주어진다. N은 12 이하인 양의 정수이고, D는 10,000보다 작거나 같은 자연수이다. 다음 N개의 줄에 지름길의 시작 위치, 도착 위치, 지름길의 길이가 주어진다. 모든 위치와 길이는 10,000보다 작거나 같은 음이 아닌 정수이다. 지름길의 시작 위치는 도착 위치보다 작다.

생각해본 풀이

최소값이 나왓으니까 다익스트라로 하면 어떨까?
근데 지름길은 중간 노드들(길들)을 다 패스하고 가는 방향으로 구성하면 좋겠다.

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

public class 지름길_1446 {

	static int N, D;
	static List<List<Road>> list;
	static int[] dist;

	static class Road implements Comparable<Road> {
		int end;
		int length;

		Road(int end, int length) {
			this.end = end;
			this.length = length;
		}

		@Override
		public int compareTo(Road r) {
			return Integer.compare(this.length, r.length);
		}
	}

	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		N = Integer.parseInt(st.nextToken()); // 지름길 개수
		D = Integer.parseInt(st.nextToken()); // 고속도로 길이

		list = new ArrayList<>();

		// 1씩 거리 연결 되어 있음. . . . .
		for (int i = 0; i < 10001; i++) {
			list.add(new ArrayList<>());
		}

		for (int n = 0; n < N; n++) {

			st = new StringTokenizer(br.readLine());

			int s = Integer.parseInt(st.nextToken()); // 시작점
			int e = Integer.parseInt(st.nextToken()); // 끝점
			int l = Integer.parseInt(st.nextToken()); // 길이

			list.get(s).add(new Road(e, l)); // 역주행할 수 없다.
		}

		dist = new int[10001]; // 거리
		for (int d = 0; d < dist.length; d++)
			dist[d] = d;

		dijkstra(0);

		System.out.println(dist[D]);
	}

	private static void dijkstra(int start) {

		if (start > D)
			return;

		if (dist[start + 1] > dist[start] + 1) {
			dist[start + 1] = dist[start] + 1;
		}

		for (int i = 0; i < list.get(start).size(); i++) {
			if (dist[start] + list.get(start).get(i).length < dist[list.get(start).get(i).end]) {
				dist[list.get(start).get(i).end] = dist[start] + list.get(start).get(i).length;
			}
		}

		dijkstra(start + 1);

	}
}

함께 보면 좋은 문제

백준 - 골드. 알고스팟

profile
프론트엔드와 디자인

0개의 댓글