[Baekjoon] 19238_μ€ννΈ νμ
λ¬Έμ (μΆμ²: 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μ΄ λ λ°°μ΄μ λ°ννλ€.