백준 1446 - 지름길

Updated:

Java

1446 번 - 지름길

문제

접근 방법

해당 지점까지 도착하는데 걸리는 비용을 나타내는 dp로 해결하였다.
기본적으로 k까지 위치에 도달하는데 걸리는 비용은 dp[k - 1] + 1 이다.

만약 해당 k 지점에서 지름길의 도착 지점과 동일하다면, 지름길의 시작점에서 지름길의 비용을 더한 값이, 현재 dp[k] 보다 작은지 확인한다.
a : 지름길의 시작
b : 지름길의 도착
c : 지름길의 비용
Math.max(dp[k], dp[k - a] + c)

코드

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

public class Main {
	static int n, result, d;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	StringTokenizer stk = new StringTokenizer(br.readLine());
    	n = stoi(stk.nextToken());
    	d = stoi(stk.nextToken());
    	int[] dp = new int[d + 1];

    	List<int[]> list = new ArrayList<>();

    	int a,b,c;
    	for(int i = 0; i < n; i++) {
    		stk = new StringTokenizer(br.readLine());
    		a = stoi(stk.nextToken());
    		b = stoi(stk.nextToken());
    		c = stoi(stk.nextToken());
    		if(b > d)
    			continue;
    		list.add(new int[] {a,b,c});
    	}

    	int len = list.size();
		// 거리 이동 시작
    	for(int i = 1; i <= d; i++) {
    		dp[i] = dp[i - 1] + 1;
			// 지름길 탐색
    		for(int j = 0; j < len; j++) {
				// 현재 위치가, 지름길의 도착지점이라면
    			if(list.get(j)[1] == i) {
					// 지름길의 시작점에서 지름길의 비용을 더해, 기존 비용보다 적은지 확인
    				dp[i] = Math.min(dp[i], dp[list.get(j)[0]] + list.get(j)[2]);
    			}
    		}
    	}

    	System.out.println(dp[d]);
    	br.close();
	}

	static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}

코드 - 다익스트라

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

public class Main {
	static int n, result, d;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	StringTokenizer stk = new StringTokenizer(br.readLine());
    	n = stoi(stk.nextToken());
    	d = stoi(stk.nextToken());
    	List<List<int[]>> list = new ArrayList<>();

    	for(int i = 0; i < d; i++) {
    		list.add(new ArrayList<>());
    		list.get(i).add(new int[] {i + 1, 1});
    	}

    	int a, b, c;
    	for (int i = 0; i < n; i++) {
			stk = new StringTokenizer(br.readLine());
			a = stoi(stk.nextToken());
			b = stoi(stk.nextToken());
			c = stoi(stk.nextToken());

			if(b <= d)
				list.get(a).add(new int[] {b,c});
		}

    	// 다익 스트라

    	int[] node = new int[d + 1];
    	boolean[] vis = new boolean[d + 1];

    	int min, max_value = 99999;
    	Arrays.fill(node, max_value);
    	node[0] = 0;
    	int curN = -1;
    	while(true) {
    		min = max_value;

    		// 제일 작은 노드를 찾는다.
    		for(int i = 0; i < d; i++) {
    			if(node[i] < min && !vis[i]) {
    				min = node[i];
    				curN = i;
    			}
    		}

    		vis[curN] = true;
    		if(min == max_value) {
    			break;
    		}
    		// 현재 경유지에서, 다음 갈 수 있는 곳을 찾는다.
    		for(int[] nd : list.get(curN)) {
    			if(!vis[nd[0]] && node[nd[0]] > node[curN] + nd[1]) {
    				node[nd[0]] = node[curN] + nd[1];
    			}
    		}
    	}
    	System.out.println(node[d]);
    	br.close();
	}

	static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}