๐ง ๋ฐฑ์ค 1446. ์ง๋ฆ๊ธธ
๋ฌธ์
๋งค์ผ ์์นจ, ์ธ์ค์ด๋ ํ๊ต์ ๊ฐ๊ธฐ ์ํด์ ์ฐจ๋ฅผ ํ๊ณ Dํฌ๋ก๋ฏธํฐ ๊ธธ์ด์ ๊ณ ์๋๋ก๋ฅผ ์ง๋๋ค. ์ด ๊ณ ์๋๋ก๋ ์ฌ๊ฐํ๊ฒ ์ปค๋ธ๊ฐ ๋ง์์ ์ ๋ง ์ด์ ํ๊ธฐ๋ ํ๋ค๋ค. ์ด๋ ๋ , ์ธ์ค์ด๋ ์ด ๊ณ ์๋๋ก์ ์ง๋ฆ๊ธธ์ด ์กด์ฌํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค. ๋ชจ๋ ์ง๋ฆ๊ธธ์ ์ผ๋ฐฉํตํ์ด๊ณ , ๊ณ ์๋๋ก๋ฅผ ์ญ์ฃผํํ ์๋ ์๋ค.
์ธ์ค์ด๊ฐ ์ด์ ํด์ผ ํ๋ ๊ฑฐ๋ฆฌ์ ์ต์๊ฐ์ ์ถ๋ ฅํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ง๋ฆ๊ธธ์ ๊ฐ์ N๊ณผ ๊ณ ์๋๋ก์ ๊ธธ์ด D๊ฐ ์ฃผ์ด์ง๋ค. N์ 12 ์ดํ์ธ ์์ ์ ์์ด๊ณ , D๋ 10,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค. ๋ค์ N๊ฐ์ ์ค์ ์ง๋ฆ๊ธธ์ ์์ ์์น, ๋์ฐฉ ์์น, ์ง๋ฆ๊ธธ์ ๊ธธ์ด๊ฐ ์ฃผ์ด์ง๋ค. ๋ชจ๋ ์์น์ ๊ธธ์ด๋ 10,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ด ์๋ ์ ์์ด๋ค. ์ง๋ฆ๊ธธ์ ์์ ์์น๋ ๋์ฐฉ ์์น๋ณด๋ค ์๋ค.
์์
์์ ์ ๋ ฅ | ์์ ์ถ๋ ฅ |
5 150 0 50 10 0 50 20 50 100 10 100 151 10 110 140 90 |
70 |
2 100 10 60 40 50 90 20 |
80 |
8 900 0 10 9 20 60 45 80 190 100 50 70 15 160 180 14 140 160 14 420 901 5 450 900 0 |
432 |
https://www.acmicpc.net/problem/1446
๐ก ๋ฌธ์ ํ์ด
๋ค์ต์คํธ๋ผ ์ ํ์ ๋ฌธ์ ์ด๋ค. ์ค๋๋ง์ ์ ํ ์ ํ์ด์ด์ ๋ฌธ์ ํ์ด์ ์ ๋ฅผ ์ข ์ฐ๊ธด ํ์ง๋ง, ํ๋ค๋ณด๋ ์ต์ํ ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ๋ณผ ์ ์์๋ค.
์ฐ์ ์ง๋ฆ๊ธธ์ ์ ์ฅํ๋ ํด๋์ค๋ฅผ ์ ์ํด์ค๋ค. ํด๋น ํด๋์ค๋ ์ถ๋ฐ ์ง์ (s), ๋์ฐฉ ์ง์ (e), ์ง๋ฆ๊ธธ์ ๊ธธ์ด(c)์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค.
๋๋ก๋ฅผ ์ญ์ฃผํ ํ ์ ์์ผ๋ฏ๋ก, ์ถ๋ฐ ์ง์ (์ถ๋ฐ ์ง์ ์ด ๊ฐ๋ค๋ฉด ๋์ฐฉ ์ง์ )์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ๋ค.
static class Road implements Comparable<Road> {
int s;
int e;
int c;
Road(int s, int e, int c) {
this.s = s;
this.e = e;
this.c = c;
}
@Override
public int compareTo(Road o) {
if (this.s == o.s) {
return this.e - o.e;
}
return this.s - o.s;
}
}
๋๋ก ์ ๋ณด๋ฅผ ๋ฆฌ์คํธ ํ์์ผ๋ก ์ ์ฅํ๋ค.
์ฌ๊ธฐ์ "์ญ์ฃผํ ํ ์ ์๋ค" ์กฐ๊ฑด๊ณผ "์ง๋ฆ๊ธธ๋ก ๊ฐ์ ๋์ ๊ธธ์ด๊ฐ ์ผ๋ฐ ์ฃผํ์ ๊ธธ์ด๋ณด๋ค ํด ์ ์๋ค" ์กฐ๊ฑด์ ํํฐ๋งํ์ฌ ์ ์ฅํด์ค๋ค.
์ ์ฅ์ด ๋๋ ํ์๋ ์์์ ์ค์ ํ ์กฐ๊ฑด์ ๋ง๊ฒ ์ ๋ ฌํด์ค๋ค.
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
int s = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
if (s > e || (e - s) <= c) continue;
al.add(new Road(s, e, c));
}
Collections.sort(al);
์ด์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ํํ๋ฉด ๋๋ค.
๊ฑฐ๋ฆฌ ์ ๋ณด ๋ฐฐ์ด(distance)์ ์ ์ํ๋ค. ์ธ์ค์ด์ ์ถ๋ฐ ์ง์ ์ 0์ด๋ฏ๋ก 0์์ ์ถ๋ฐํ๋ ๊ธฐ์ค์ผ๋ก ์ผ์ฐจ์ ๋ฐฐ์ด์ ์ ์ํ๊ณ , 0๋ฒ์งธ ๊ฐ์ 0์ผ๋ก ์ด๊ธฐํํด์ค๋ค. ๋ฐ๋ณต๋ฌธ์ ๋๊ธฐ ์ ์ ์ง๋ฆ๊ธธ ๋ฆฌ์คํธ์ ์ธ๋ฑ์ค ๊ฐ์ ๊ธฐ์ตํ๋ ๊ฐ(idx)๊ณผ ์ธ์ค์ด์ ์ค์๊ฐ ์ด๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ์ตํ๋ ๊ฐ(move)์ ์ด๊ธฐํํ๋ค. ์ดํ ์ธ์ค์ด๊ฐ ๋์ฐฉ ์ง์ (D)์ ๋๋ฌํ ๋๊น์ง ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ํํ๋ค.
int[] distance = new int[10001];
Arrays.fill(distance, 10001);
distance[0] = 0;
int idx = 0, move = 0;
while (move < D) {
if (idx < al.size()) {
Road r = al.get(idx);
if (move == r.s) {
distance[r.e] = Math.min(distance[r.e], distance[move] + r.c);
idx++;
continue;
}
}
distance[move + 1] = Math.min(distance[move + 1], distance[move] + 1);
move++;
}
์ง๋ฆ๊ธธ ๋ฆฌ์คํธ๋ฅผ ๋ชจ๋ ๋ฐฉ๋ฌธํ ๋๊น์ง(idx < al.size()) ์ง๋ฆ๊ธธ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ฐ์ง๋ค.
๋ง์ฝ ์ธ์ค์ด๊ฐ ํ์ฌ ์์นํ๋ ์ง์ (move)์ด ์ง๋ฆ๊ธธ์ ์์ ์ง์ (r.s)๊ณผ ๊ฐ๋ค๋ฉด, ์ง๋ฆ๊ธธ์ ์ด์ฉํ์ ๊ฒฝ์ฐ์ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ๋ฅผ ๋น๊ตํด์ ๊ฑฐ๋ฆฌ ๋ฐฐ์ด(distance[r.e])์ ์ ๋ฐ์ดํธ ์ํจ๋ค. ์ง๋ฆ๊ธธ์ ์ฌ์ฉํ์ผ๋ฉด idx++ํ์ฌ ๋ฆฌ์คํธ์ ์์น ๊ฐ๋ ์ ๋ฐ์ดํธ ํด์ฃผ์ด์ผ ํ๋ค.
์ง๋ฆ๊ธธ์ ์ด์ฉํ๋ค๋ฉด continue๋ฅผ ์ฌ์ฉํด์ ๋ค์ ์ง์ ์ผ๋ก ๋์ด๊ฐ๊ณ , ์ฌ์ฉํ์ง ์์๋ค๋ฉด ์ผ๋ฐ ๋๋ก๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ๋ฅผ ๋ฐ์ ธ์ผํ๋ค.
์ธ์ค์ด๊ฐ ๋๋ก์ 1๋งํผ ๊ฐ์ ๊ฒฝ์ฐ์ ๊ฑฐ๋ฆฌ ์์น ๋ฐฐ์ด(distnace)์ ๋น๊ตํด์ ์ ๋ฐ์ดํธ ํด์ค๋ค. ํ ์นธ ๊ฐ์ผ๋ฉด move++ํ์ฌ ์ธ์ค์ด๊ฐ ์ด๋ํ ๊ฑฐ๋ฆฌ๋ฅผ ์ ๋ฐ์ดํธ ์ํจ๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ์ํ ์ดํ ์ธ์ค์ด์ ๋ชฉํ ์ง์ ์ ์ต๋จ ๊ฑฐ๋ฆฌ(distance[D])๋ฅผ ๊ตฌํ ์ ์๋ค.
์ ํ์ด ๋ฐฉ์์ ์ ์ฒด ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ์ด๋ด๋ฉด ์๋์ ๊ฐ๋ค.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;
public class ์ง๋ฆ๊ธธ_1446 {
static class Road implements Comparable<Road> {
int s;
int e;
int c;
Road(int s, int e, int c) {
this.s = s;
this.e = e;
this.c = c;
}
@Override
public int compareTo(Road o) {
if (this.s == o.s) {
return this.e - o.e;
}
return this.s - o.s;
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int D = Integer.parseInt(st.nextToken());
List<Road> al = new ArrayList<>();
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
int s = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
if (s > e || (e - s) <= c) continue;
al.add(new Road(s, e, c));
}
Collections.sort(al);
int[] distance = new int[10001];
Arrays.fill(distance, 10001);
distance[0] = 0;
int idx = 0, move = 0;
while (move < D) {
if (idx < al.size()) {
Road r = al.get(idx);
if (move == r.s) {
distance[r.e] = Math.min(distance[r.e], distance[move] + r.c);
idx++;
continue;
}
}
distance[move + 1] = Math.min(distance[move + 1], distance[move] + 1);
move++;
}
System.out.println(distance[D]);
}
}
โจ ํฌ์คํ ์ ๋ง์น๋ฉฐ
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ด๋์ ๋ ์ต์ํด์ก๋ค๊ณ ์๊ฐํ๋๋ฐ ๋ง์ ์ค๋๋ง์ ์ ํ๋๊น ๋ฌธ์ ์ ์ ์ฉ์ํค๋ ๊ฒ์ด ์ด๋ ต๊ฒ ๋๊ปด์ก๋ค. ๋ค์ ๊พธ์คํ ๋ฌธ์ ๋ฅผ ํ์ด์ผ๊ฒ ๋ค. ์ด๋ฒ ๋ฌธ์ ๋ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋๊น ๊ฐ๋ ์ฑ๊ณผ ์ ๋ ฌ ๋ชจ๋ ๋จ์ํ๋์ด ์ข์๋ค.
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค LV2] ๊ธฐ๋ฅ๊ฐ๋ฐ (Queue, ํ) (0) | 2023.10.17 |
---|---|
[๋ฐฑ์ค 1162] ๋๋กํฌ์ฅ (Dijkstra, ๋ค์ต์คํธ๋ผ) (2) | 2023.10.16 |
[ํ๋ก๊ทธ๋๋จธ์ค LV3] ๋ฒ ์คํธ ์จ๋ฒ (Hash, ํด์) (2) | 2023.10.14 |
[ํ๋ก๊ทธ๋๋จธ์ค LV2] ์ ํ๋ฒํธ ๋ชฉ๋ก (Hash, ํด์) (0) | 2023.10.14 |
[๋ฐฑ์ค 1629] ๊ณฑ์ (๋ถํ ์ ๋ณต, Divide and Conquer) (0) | 2022.11.26 |