Skip to content

Commit 09b9c23

Browse files
committed
[Silver I] Title: 지름길, Time: 104 ms, Memory: 14160 KB -BaekjoonHub
1 parent b29acea commit 09b9c23

File tree

2 files changed

+102
-0
lines changed

2 files changed

+102
-0
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# [Silver I] 지름길 - 1446
2+
3+
[문제 링크](https://www.acmicpc.net/problem/1446)
4+
5+
### 성능 요약
6+
7+
메모리: 14160 KB, 시간: 104 ms
8+
9+
### 분류
10+
11+
다이나믹 프로그래밍, 그래프 이론, 최단 경로, 데이크스트라
12+
13+
### 제출 일자
14+
15+
2025년 11월 26일 10:53:56
16+
17+
### 문제 설명
18+
19+
<p>매일 아침, 세준이는 학교에 가기 위해서 차를 타고 D킬로미터 길이의 고속도로를 지난다. 이 고속도로는 심각하게 커브가 많아서 정말 운전하기도 힘들다. 어느 날, 세준이는 이 고속도로에 지름길이 존재한다는 것을 알게 되었다. 모든 지름길은 일방통행이고, 고속도로를 역주행할 수는 없다.</p>
20+
21+
<p>세준이가 운전해야 하는 거리의 최솟값을 출력하시오.</p>
22+
23+
### 입력
24+
25+
<p>첫째 줄에 지름길의 개수 N과 고속도로의 길이 D가 주어진다. N은 12 이하인 양의 정수이고, D는 10,000보다 작거나 같은 자연수이다. 다음 N개의 줄에 지름길의 시작 위치, 도착 위치, 지름길의 길이가 주어진다. 모든 위치와 길이는 10,000보다 작거나 같은 음이 아닌 정수이다. 지름길의 시작 위치는 도착 위치보다 작다.</p>
26+
27+
### 출력
28+
29+
<p>세준이가 운전해야하는 거리의 최솟값을 출력하시오.</p>
30+
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
6+
static class Road {
7+
8+
int start;
9+
int end;
10+
int cost;
11+
12+
public Road(int start, int end, int cost) {
13+
this.start = start;
14+
this.end = end;
15+
this.cost = cost;
16+
}
17+
}
18+
public static void main(String[] args) throws Exception {
19+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
20+
21+
StringTokenizer st = new StringTokenizer(br.readLine());
22+
int N = Integer.parseInt(st.nextToken());
23+
int D = Integer.parseInt(st.nextToken());
24+
25+
int dp[]= new int[D+1];
26+
27+
for(int i =1; i<=D; i++) {
28+
dp[i] = i;
29+
}
30+
List<Road> roads= new ArrayList<>();
31+
for(int i =0; i<N; i++) {
32+
st = new StringTokenizer(br.readLine());
33+
int start = Integer.parseInt(st.nextToken());
34+
int end = Integer.parseInt(st.nextToken());
35+
int cost = Integer.parseInt(st.nextToken());
36+
if(end > D) {
37+
continue;
38+
}
39+
if(end - start <= cost) {
40+
continue;
41+
}
42+
roads.add(new Road(start, end, cost));
43+
}
44+
roads.sort((r1, r2) -> r1.start - r2.start);
45+
Arrays.fill(dp, Integer.MAX_VALUE);
46+
47+
dp[0] = 0;
48+
int idx = 0;
49+
for(int i =0; i<D; i++) {
50+
51+
dp[i+1] =Math.min(dp[i]+1, dp[i+1]);
52+
53+
while(idx < roads.size() && roads.get(idx).start == i) {
54+
Road road = roads.get(idx);
55+
dp[road.end] = Math.min(dp[road.end], dp[i] + road.cost);
56+
idx+=1;
57+
}
58+
}
59+
System.out.println(dp[D]);
60+
}
61+
}
62+
/*
63+
dp냐, 뭔가 다익스트라나 최소 경로 알고리즘은 아닌 것 같은 느낌인데. 우선순위큐에 담아서 다음 지름길까지 그냥 더하기? 해볼만 한 거 같은데. 왜
64+
아 dp다. 왜냐면 그리디로 탈 수 있는 거 먼저 타도, 뒤에 있는 거로 한 번에 갈 수 잇으니 .. 어 다익스트라가 맞네 ..
65+
그럼 시작을 0에서 한다고 하면 , 0->1, 1->2 이렇게 가야하는 건가? 굳이 ? 아 다익스트라가 애초에 우선순위 큐에서 가장 비용이 낮은 걸 기준으로 하는 거지. 그렇다면 만약 0에서 시작하는 지름 길이 없다고 해보자.
66+
67+
만약 100까지 가야함. 근데 10 ->50 10이 있고, 70 -> 90 10이 있다고 했을 때, 0,10 10,50, 50,70, 70,90, 90 100 이렇게 가야하는데, 지름길이 없는 경우는 어떻게 해야할지 ..... 흠 . 만약 통과한 지름길이 있다면 그것을 넣어놔야하나 ?우선순위 큐에
68+
69+
0~150까지 dp 만들고, 각 크기만큼 넣어놓은 뒤, 순회? 0~50 이면 50을 10으로 바꾼다음 10부터 150까지 또 업뎃 ?
70+
그 다음 0 ~50 또 떴을때 20이니까 pass 그다음 50~100까지 10이니까 100 확인 후 바꾸고 100~150업뎃 100 151 151은 넘으니 pass
71+
dp[1] = 1; dp[2] = 2; dp[3] = 3; .. dp[30] = 10
72+
*/

0 commit comments

Comments
 (0)