๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 19238_์Šคํƒ€ํŠธ ํƒ์‹œ

๋ฟŒ์•ผ._. 2024. 2. 5. 17:22

Gold II

๋ฌธ์ œ(์ถœ์ฒ˜: https://www.acmicpc.net/problem/19238)

< ์Šคํƒ€ํŠธ ํƒ์‹œ >

 

๋ฌธ์ œ ํ’€์ด 

 

ํ˜„์žฌ ์œ„์น˜์—์„œ ๋ชจ๋“  ์œ„์น˜๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๊ฐ€์žฅ ๊ฐ€๊นŒ์ด ์žˆ๋Š” ์†๋‹˜์„ ์ฐพ๋Š”๋‹ค. ์†๋‹˜ ์œ„์น˜๋กœ ์ด๋™ ํ›„ ์†๋‹˜์˜ ๋ชฉ์ ์ง€๊นŒ์ง€ ์ด๋™ํ•œ๋‹ค. ์ด ๊ณผ์ •์„ ๋ชจ๋“  ์†๋‹˜์„ ์ด๋™์‹œํ‚ฌ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

 

์ด ๋ฌธ์ œ์—์„œ ๊ณ ๋ คํ•ด์•ผ ํ•  ๊ฒƒ์€ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ™์€ ์†๋‹˜์ด ์žˆ๋‹ค๋ฉด ํ–‰ ๋ฒˆํ˜ธ๊ฐ€ ์ž‘๊ณ , ์—ด ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ์†๋‹˜์„ ํƒํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

 my solution (Java)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.StringTokenizer;

public class _19238_ { // ์Šคํƒ€ํŠธ ํƒ์‹œ
	static int arr[][], n;
	static boolean visited[][];
	static int dx[] = { -1, 0, 0, 1 }; // ์ƒ์ขŒ์šฐํ•˜
	static int dy[] = { 0, -1, 1, 0 };

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(bf.readLine());

		n = Integer.parseInt(st.nextToken());
		int m = Integer.parseInt(st.nextToken());
		int fuel = Integer.parseInt(st.nextToken());

		arr = new int[n + 1][n + 1];
		visited = new boolean[n + 1][n + 1];

		for (int i = 1; i <= n; i++) {
			st = new StringTokenizer(bf.readLine());
			for (int j = 1; j <= n; j++) {
				arr[i][j] = Integer.parseInt(st.nextToken());
			}
		}

		st = new StringTokenizer(bf.readLine());
		int x = Integer.parseInt(st.nextToken());
		int y = Integer.parseInt(st.nextToken());

		int idx = 2;
		HashMap<Integer, int[]> map = new HashMap<>();

		for (int i = 0; i < m; i++) {
			st = new StringTokenizer(bf.readLine());
			int startX = Integer.parseInt(st.nextToken());
			int startY = Integer.parseInt(st.nextToken());
			int endX = Integer.parseInt(st.nextToken());
			int endY = Integer.parseInt(st.nextToken());

			arr[startX][startY] = idx;
			map.put(idx++, new int[] { endX, endY });
		}

		while (fuel > 0) {
			init();
			int info[] = findCustomer(x, y);

			if (info[0] == -1 && info[1] == -1) {
				break;
			}

			arr[info[0]][info[1]] = 0;
			fuel -= info[3];
			if (fuel <= 0) {
				break;
			}

			init();
			info = taxi(info[0], info[1], map.get(info[2]));

			if (info[0] == -1 && info[1] == -1) {
				break;
			}

			fuel -= info[2];
			if (fuel < 0) {
				break;
			}
			fuel += (info[2] * 2);
			m -= 1;
			x = info[0];
			y = info[1];

			if (m == 0) {
				break;
			}

		}

		if (m > 0 || fuel <= 0) { // ๋ชจ๋“  ์†๋‹˜์„ ์ด๋™์‹œํ‚ฌ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์ด๋™ ๋„์ค‘์— ์—ฐ๋ฃŒ๊ฐ€ ๋ฐ”๋‹ฅ๋‚œ ๊ฒฝ์šฐ
			System.out.println(-1);
		} else { // ๋ชจ๋“  ์†๋‹˜์„ ์ด๋™์‹œํ‚ค๊ณ  ์—ฐ๋ฃŒ๋ฅผ ์ถฉ์ „ํ–ˆ์„ ๋•Œ ๋‚จ์€ ์—ฐ๋ฃŒ์˜ ์–‘
			System.out.println(fuel);
		}

	}

	// ๋ฐฉ๋ฌธ ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”
	private static void init() {
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				visited[i][j] = false;
			}
		}

	}

	// ํ˜„์žฌ ์œ„์น˜์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์†๋‹˜ ์ฐพ๊ธฐ
	private static int[] findCustomer(int x, int y) {
		if (arr[x][y] > 1) {
			return new int[] { x, y, arr[x][y], 0 };
		}

		Queue<int[]> queue = new LinkedList<>();
		PriorityQueue<int[]> pri = new PriorityQueue<>(new Comparator<int[]>() {

			@Override
			public int compare(int[] o1, int[] o2) {
				if (o1[3] == o2[3]) {
					if (o1[0] == o2[0]) {
						return o1[1] - o2[1];
					}
					return o1[0] - o2[0];
				}
				return o1[3] - o2[3];
			}
		});
		queue.add(new int[] { x, y, 0 });
		visited[x][y] = true;

		while (!queue.isEmpty()) {
			int info[] = queue.poll();
			for (int i = 0; i < 4; i++) {
				int a = info[0] + dx[i];
				int b = info[1] + dy[i];
				if (a > 0 && a <= n && b > 0 && b <= n && arr[a][b] != 1 && !visited[a][b]) {
					visited[a][b] = true;
					if (arr[a][b] > 1) {
						if (pri.size() == 0 || pri.peek()[3] >= info[2] + 1) {
							pri.add(new int[] { a, b, arr[a][b], info[2] + 1 });
						}
					}
					queue.add(new int[] { a, b, info[2] + 1 });
				}
			}
		}

		if (pri.isEmpty()) {
			return new int[] { -1, -1, -1, -1 };
		} else {
			return pri.poll();
		}
	}

	// ์†๋‹˜ ์ถœ๋ฐœ์ง€์—์„œ ๋ชฉ์ ์ง€๊นŒ์ง€ ์ด๋™
	private static int[] taxi(int x, int y, int[] find) {
		Queue<int[]> queue = new LinkedList<>();
		queue.add(new int[] { x, y, 0 });
		visited[x][y] = true;

		while (!queue.isEmpty()) {
			int info[] = queue.poll();
			for (int i = 0; i < 4; i++) {
				int a = info[0] + dx[i];
				int b = info[1] + dy[i];
				if (a > 0 && a <= n && b > 0 && b <= n && arr[a][b] != 1 && !visited[a][b]) {
					visited[a][b] = true;
					if (a == find[0] && b == find[1]) {
						return new int[] { a, b, info[2] + 1 };
					}
					queue.add(new int[] { a, b, info[2] + 1 });
				}
			}
		}
		return new int[] { -1, -1, -1 };
	}
}
๋ณ€์ˆ˜)
n : ๊ฒฉ์ž ํฌ๊ธฐ
m : ์†๋‹˜ ์ˆ˜
fuel : ์—ฐ๋ฃŒ ์–‘
arr : ์ง€๋„ ์ •๋ณด
visited : ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
x, y : ์šด์ „์„ ์‹œ์ž‘ํ•˜๋Š” ์นธ์˜ ํ–‰ ๋ฒˆํ˜ธ, ์—ด ๋ฒˆํ˜ธ 
idx : ์†๋‹˜ ๋ฒˆํ˜ธ
map : <์†๋‹˜ ๋ฒˆํ˜ธ, ์†๋‹˜ ๋ชฉ์ ์ง€>
startX, startY, endX, endY : ์†๋‹˜์˜ ์ถœ๋ฐœ์ง€์˜ ํ–‰, ์—ด ๋ฒˆํ˜ธ, ๋ชฉ์ ์ง€์˜ ํ–‰, ์—ด ๋ฒˆํ˜ธ

 

Main

๊ฒฉ์ž ํฌ๊ธฐ, ์†๋‹˜ ์ˆ˜, ์—ฐ๋ฃŒ ์–‘์„ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค. ์ง€๋„ ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ arr์— ์ €์žฅํ•œ๋‹ค. ์šด์ „์„ ์‹œ์ž‘ํ•˜๋Š” ์œ„์น˜๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ , ์†๋‹˜์˜ ์œ„์น˜๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค. ์†๋‹˜์˜ ์œ„์น˜๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ arr ์ง€๋„์— ์†๋‹˜ ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•˜๊ณ , HashMap์— ์†๋‹˜ ๋ฒˆํ˜ธ์™€ ๋ชฉ์ ์ง€ ์œ„์น˜๋ฅผ ์ €์žฅํ•œ๋‹ค.

 

์—ฐ๋ฃŒ๊ฐ€ ๋‚จ์•„์žˆ๋Š” ๋™์•ˆ ์•„๋ž˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

1) ๋ฐฉ๋ฌธ ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”

2) findCustomer ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ์œ„์น˜์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์†๋‹˜ ์œ„์น˜ ๊ตฌํ•˜๊ธฐ

3) ๋งŒ์•ฝ ๋ชจ๋“  ์†๋‹˜ํ•œํ…Œ ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์ข…๋ฃŒ

4) ๊ฐ€๊นŒ์šด ์†๋‹˜ํ•œํ…Œ ์ด๋™ ํ›„ ์—ฐ๋ฃŒ ์†Œ๋ชจ. ์—ฐ๋ฃŒ๊ฐ€ 0 ์ดํ•˜๋ผ๋ฉด ๋ชฉ์ ์ง€๊นŒ์ง€ ์ด๋™ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ข…๋ฃŒ

5) ๋ฐฉ๋ฌธ ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”

6) ์†๋‹˜์„ ํƒœ์šฐ๊ณ  ์†๋‹˜ ๋ชฉ์ ์ง€๊นŒ์ง€ ์ด๋™

7) ๋ชฉ์ ์ง€๊นŒ์ง€ ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์ข…๋ฃŒ

8) ๋ชฉ์ ์ง€๊นŒ์ง€ ์ด๋™ ํ›„ ์—ฐ๋ฃŒ ์†Œ๋ชจ. ๋งŒ์•ฝ ๋‚จ์€ ์—ฐ๋ฃŒ๊ฐ€ 0๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ๋ชฉ์ ์ง€๊นŒ์ง€ ์ด๋™ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ์ข…๋ฃŒ. ๋‚จ์€ ์—ฐ๋ฃŒ๊ฐ€  0 ์ด์ƒ์ด๋ผ๋ฉด ์†Œ๋ชจํ•œ ์—ฐ๋ฃŒ ์–‘์˜ ๋‘ ๋ฐฐ ์ถฉ์ „

9) ์†๋‹˜ ํ•œ ๋ช…์„ ๋ชฉ์ ์ง€๊นŒ์ง€ ์ด๋™์‹œํ‚จ ๊ฒƒ์ด๋ฏ€๋กœ m-1 ๋ฐ ํ˜„์žฌ ์œ„์น˜ ์—…๋ฐ์ดํŠธ

10) m์ด 0์ด๋ผ๋ฉด ๋ชจ๋“  ์†๋‹˜์„ ๋ชฉ์ ์ง€๊นŒ์ง€ ์ด๋™์‹œํ‚จ ๊ฒƒ์ด๋ฏ€๋กœ ์ข…๋ฃŒ

 

๋ชจ๋“  ์†๋‹˜์„ ์ด๋™์‹œํ‚ฌ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์ด๋™ ๋„์ค‘์— ์—ฐ๋ฃŒ๊ฐ€ ๋ฐ”๋‹ฅ๋‚œ ๊ฒฝ์šฐ -1์„ ์ถœ๋ ฅํ•œ๋‹ค. ๊ทธ ์™ธ ๋ชจ๋“  ์†๋‹˜์„ ์ด๋™์‹œํ‚ค๊ณ  ์—ฐ๋ฃŒ๋ฅผ ์ถฉ์ „ํ–ˆ์„ ๋•Œ ๋‚จ์€ ์—ฐ๋ฃŒ์˜ ์–‘์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

init

๋ฐฉ๋ฌธ ๋ฐฐ์—ด viisted๋ฅผ false๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

 

findCustomer (x, y)

: [์†๋‹˜ ์œ„์น˜, ์†๋‹˜ ๋ฒˆํ˜ธ, ๊ฑฐ๋ฆฌ] ๋ฐ˜ํ™˜

์‹œ์ž‘ ์œ„์น˜์— ์†๋‹˜์ด ์žˆ๋‹ค๋ฉด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์†๋‹˜์ด๋ฏ€๋กœ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ข…๋ฃŒํ•œ๋‹ค.

queue์— [์‹œ์ž‘ ์œ„์น˜, ๊ฑฐ๋ฆฌ 0]์„ ์ €์žฅํ•˜๋ฉฐ ์‹œ์ž‘ ์œ„์น˜๋ฅผ ๋ฐฉ๋ฌธ ํ‘œ์‹œํ•œ๋‹ค. 

์šฐ์„ ์ˆœ์œ„ ํ๋Š” [์†๋‹˜ ์œ„์น˜ x, y, ์†๋‹˜ ๋ฒˆํ˜ธ, ๊ฑฐ๋ฆฌ]๋ฅผ ์ €์žฅํ•˜๋ฉฐ ๊ฑฐ๋ฆฌ๋ฅผ ์šฐ์„ ์ˆœ์œ„๋กœ, ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ™๋‹ค๋ฉด ์†๋‹˜ ์œ„์น˜์˜ x, y๋ฅผ ์šฐ์„ ์ˆœ์œ„๋กœ ๋‘”๋‹ค.

 

queue๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ์•„๋ž˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

1) queue poll

2) ์ƒ์ขŒ์šฐํ•˜ ํƒ์ƒ‰ํ•˜์—ฌ ์ง€๋„ ๋ฒ”์œ„ ์•ˆ์ด๋ฉฐ ๋น„์–ด์žˆ๋Š” ์นธ์ด๋ฉฐ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ณณ์ด๋ผ๋ฉด ๋ฐฉ๋ฌธ ํ‘œ์‹œํ•œ๋‹ค. ๋งŒ์•ฝ ๊ทธ ์œ„์น˜์— ์†๋‹˜์ด ์žˆ๋‹ค๋ฉด ์šฐ์„ ์ˆœ์œ„ ํ๊ฐ€ ๋น„์—ˆ๊ฑฐ๋‚˜ ์šฐ์„ ์ˆœ์œ„ ํ์— ์žˆ๋Š” ๊ฐ’์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด ๊ฐ’์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ์†๋‹˜์ด ์žˆ๊ฑฐ๋‚˜ ์—†๊ฑฐ๋‚˜ queue์—๋Š” ๊ฐ’์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

์šฐ์„ ์ˆœ์œ„ ํ๊ฐ€ ๋น„์—ˆ๋‹ค๋ฉด ์–ด๋Š ์†๋‹˜ํ•œํ…Œ๋„ ๊ฐˆ ์ˆ˜ ์—†๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ -1์ด ๋“  ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์šฐ์„ ์ˆœ์œ„ ํ์— ๊ฐ’์ด ์žˆ๋‹ค๋ฉด poll ํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 

 

taxi (x, y, ๋„์ฐฉ์œ„์น˜ find)

: [์†๋‹˜ ์œ„์น˜, ๊ฑฐ๋ฆฌ] ๋ฐ˜ํ™˜

queue์— [์‹œ์ž‘ ์œ„์น˜, ๊ฑฐ๋ฆฌ 0]์„ ์ €์žฅํ•˜๋ฉฐ ์‹œ์ž‘ ์œ„์น˜๋ฅผ ๋ฐฉ๋ฌธ ํ‘œ์‹œํ•œ๋‹ค.

 

queue๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ์•„๋ž˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

1) queue poll

2) ์ƒ์ขŒ์šฐํ•˜ ํƒ์ƒ‰ํ•˜์—ฌ ์ง€๋„ ๋ฒ”์œ„ ์•ˆ์ด๋ฉฐ ๋น„์–ด์žˆ๋Š” ์นธ์ด๋ฉฐ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์„ ๊ณณ์ด๋ผ๋ฉด ๋ฐฉ๋ฌธ ํ‘œ์‹œํ•œ๋‹ค. ๋งŒ์•ฝ ๊ทธ ์œ„์น˜๊ฐ€ ๋„์ฐฉ ์œ„์น˜๋ผ๋ฉด [๋„์ฐฉ ์œ„์น˜, ๊ฑฐ๋ฆฌ]๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋„์ฐฉ ์œ„์น˜๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด queue์— ๊ฐ’์„ ์ €์žฅํ•œ ํ›„ ๊ณ„์†ํ•œ๋‹ค.

 

๋งŒ์•ฝ ๋„์ฐฉ ์œ„์น˜์— ๋„๋‹ฌํ•˜์ง€ ๋ชปํ•œ๋‹ค๋ฉด -1์ด ๋“  ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.