๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm

[๋ฐฑ์ค€ 1446] ์ง€๋ฆ„๊ธธ (Dijkstra, ๋‹ค์ต์ŠคํŠธ๋ผ)

๋ฐ˜์‘ํ˜•
SMALL

๐Ÿง ๋ฐฑ์ค€ 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

 

1446๋ฒˆ: ์ง€๋ฆ„๊ธธ

์ฒซ์งธ ์ค„์— ์ง€๋ฆ„๊ธธ์˜ ๊ฐœ์ˆ˜ N๊ณผ ๊ณ ์†๋„๋กœ์˜ ๊ธธ์ด D๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. N์€ 12 ์ดํ•˜์ธ ์–‘์˜ ์ •์ˆ˜์ด๊ณ , D๋Š” 10,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์— ์ง€๋ฆ„๊ธธ์˜ ์‹œ์ž‘ ์œ„์น˜, ๋„์ฐฉ ์œ„์น˜, ์ง€๋ฆ„๊ธธ์˜ ๊ธธ์ด

www.acmicpc.net

 

๐Ÿ’ก ๋ฌธ์ œ ํ’€์ด

๋‹ค์ต์ŠคํŠธ๋ผ ์œ ํ˜•์˜ ๋ฌธ์ œ์ด๋‹ค. ์˜ค๋žœ๋งŒ์— ์ ‘ํ•œ ์œ ํ˜•์ด์–ด์„œ ๋ฌธ์ œ ํ’€์ด์— ์• ๋ฅผ ์ข€ ์“ฐ๊ธด ํ–ˆ์ง€๋งŒ, ํ’€๋‹ค๋ณด๋‹ˆ ์ต์ˆ™ํ•œ ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

์šฐ์„  ์ง€๋ฆ„๊ธธ์„ ์ €์žฅํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•ด์ค€๋‹ค. ํ•ด๋‹น ํด๋ž˜์Šค๋Š” ์ถœ๋ฐœ ์ง€์ (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]);

	}
}

 

โœจ ํฌ์ŠคํŒ…์„ ๋งˆ์น˜๋ฉฐ

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์–ด๋Š์ •๋„ ์ต์ˆ™ํ•ด์กŒ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ๋ง‰์ƒ ์˜ค๋žœ๋งŒ์— ์ ‘ํ•˜๋‹ˆ๊นŒ ๋ฌธ์ œ์— ์ ์šฉ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์–ด๋ ต๊ฒŒ ๋Š๊ปด์กŒ๋‹ค. ๋‹ค์‹œ ๊พธ์ค€ํžˆ ๋ฌธ์ œ๋ฅผ ํ’€์–ด์•ผ๊ฒ ๋‹ค. ์ด๋ฒˆ ๋ฌธ์ œ๋„ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋‹ˆ๊นŒ ๊ฐ€๋…์„ฑ๊ณผ ์ •๋ ฌ ๋ชจ๋‘ ๋‹จ์ˆœํ™”๋˜์–ด ์ข‹์•˜๋‹ค.

๋ฐ˜์‘ํ˜•
LIST