๋ฌธ์ (์ถ์ฒ: 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์ด ๋ ๋ฐฐ์ด์ ๋ฐํํ๋ค.
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 3085_์ฌํ ๊ฒ์ (0) | 2024.02.07 |
---|---|
[Baekjoon] 2578_๋น๊ณ (1) | 2024.02.06 |
[Baekjoon] 1167_ํธ๋ฆฌ์ ์ง๋ฆ (1) | 2024.02.02 |
[Baekjoon] 11967_๋ถ์ผ๊ธฐ (0) | 2024.02.01 |
[Baekjoon] 8892_ํฐ๋ฆฐ๋๋กฌ (1) | 2024.01.31 |