๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/1726)
< ๋ก๋ด >
๋ฌธ์ ํ์ด
๋จผ์ ํ์ฌ ์์น์์ ๋์๋จ๋ถ์ผ๋ก ์ด๋ํด ๋ณธ๋ค. ํ ๋ฒ ์ด๋ํ ๋ ์ต๋ 3์นธ ์ด๋ํ ์ ์์ผ๋ฏ๋ก 1์นธ, 2์นธ, 3์นธ์ ์ด๋์์ผ ๋ณธ๋ค. ์ค๊ฐ์ 1์ด ์์ผ๋ฉด ์ด๋ํ ์ ์๋ค๋ ๊ฒ์ ๊ณ ๋ คํด์ผ ํ๋ค.
๋ง์ฝ ๋์๋จ๋ถ์ผ๋ก ์ด๋ ๊ฐ๋ฅํ๋ค๋ฉด ํ์ฌ ๋ฐฉํฅ์์ ์ด๋ ๊ฐ๋ฅํ ๋ฐฉํฅ์ผ๋ก ๋ฐ๊ฟ์ค์ผ ํ๋ฏ๋ก ๋ช ๋ น์ ํ์๋ฅผ ๊ตฌํด์ค๋ค.
์ด๋, ๋ฐฉํฅ ๋ฒํธ๋ก๋ง ๋ช ๋ น์ ์๋ฅผ ๊ตฌํ ๊ฒฝ์ฐ ๋์์ ๋ถ์ผ๋ก ๊ฐ๋ ๊ฒฝ์ฐ 2๋ฒ์ผ๋ก ๊ตฌํด์ง์ง๋ง ์ค์ ๋ก๋ 1๋ฒ์ธ ๊ฒ์ ๊ณ ๋ คํด์ผ ํ๋ค.
์ด๋ํ ๊ณณ์ด ์ต์ข ์ํ๋ ์์น๋ผ๋ฉด ์ํ๋ ๋ฐฉํฅ์ผ๋ก ๋ฐ๋ผ๋ณด๋๋ก ๊ณ์ฐํด์ฃผ์ด์ผ ํ๋ค. ์ต์ ๋ช ๋ น ํ์๋ผ๋ ๋ณด์ฅ์ด ์์ผ๋ฏ๋ก ์ค๊ฐ์ ๊ทธ๋ง๋์ง ์๊ณ ์ ์ฒด ๋ค ๊ณ์ฐ ํ ์ต์๊ฐ์ ์ฐพ์์ค๋ค.
์ด๋ํ ๊ณณ์ด ์ต์ข ์ํ๋ ์์น๊ฐ ์๋๋ผ๋ฉด ๊ทธ ์์น์ ๋ฐฉ๋ฌธํ ์ ์ด ์๋์ง ํ์ธํ๋ค. ๋ฐฉ๋ฌธ์ ํ ์ ์ด ์๊ฑฐ๋, ๋ฐฉ๋ฌธ์ ํ์์ง๋ง ๋ช ๋ น์ ํ์๊ฐ ๊ทธ๋๋ณด๋ค ์ ๋ค๋ฉด queue์ ์ถ๊ฐํด ์ค๋ค.
my solution (Java)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class _1726_ { // ๋ก๋ด
static int arr[][], visited[][], m, n, x2, y2, dir2;
static int dx[] = { 0, 0, 1, -1 };
static int dy[] = { 1, -1, 0, 0 };
public static class Robot {
int x, y, dir, depth;
public Robot(int x, int y, int dir, int depth) {
this.x = x;
this.y = y;
this.dir = dir;
this.depth = depth;
}
}
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
m = Integer.parseInt(st.nextToken());
n = Integer.parseInt(st.nextToken());
arr = new int[m][n];
visited = new int[m][n];
for (int i = 0; i < m; i++) {
st = new StringTokenizer(bf.readLine());
for (int j = 0; j < n; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
visited[i][j] = -1;
}
}
st = new StringTokenizer(bf.readLine());
int x1 = Integer.parseInt(st.nextToken()) - 1;
int y1 = Integer.parseInt(st.nextToken()) - 1;
int dir1 = Integer.parseInt(st.nextToken()) - 1;
st = new StringTokenizer(bf.readLine());
x2 = Integer.parseInt(st.nextToken()) - 1;
y2 = Integer.parseInt(st.nextToken()) - 1;
dir2 = Integer.parseInt(st.nextToken()) - 1;
int result = 0;
if (x1 == x2 && y1 == y2) {
result = dirCalc(dir2, dir1, 0);
} else {
result = bfs(x1, y1, dir1);
}
System.out.println(result);
}
private static int bfs(int a, int b, int dir) {
Queue<Robot> queue = new LinkedList<>();
queue.add(new Robot(a, b, dir, 0));
visited[a][b] = 0;
boolean flag = false;
int cnt = -1;
while (!queue.isEmpty()) {
Robot robot = queue.poll();
for (int i = 0; i < 4; i++) {
flag = false;
for (int j = 1; j <= 3; j++) {
int x = robot.x + (dx[i] * j);
int y = robot.y + (dy[i] * j);
if (x >= 0 && x < m && y >= 0 && y < n && arr[x][y] == 0) {
flag = true;
int depth = dirCalc(robot.dir, i, robot.depth);
Robot newRobot = new Robot(x, y, i, depth + 1);
if (x == x2 && y == y2) {
depth = dirCalc(dir2, i, depth) + 1;
if (cnt == -1 || cnt > depth) {
cnt = depth;
}
}
if (visited[x][y] == -1 || visited[x][y] > newRobot.depth) {
visited[x][y] = newRobot.depth;
queue.add(newRobot);
}
} else {
flag = false;
}
if (!flag)
break;
}
}
}
return cnt;
}
public static int dirCalc(int x, int y, int depth) {
if ((x == 2 && y == 3) || (x == 3 && y == 2) || (x == 1 && y == 0) || (x == 0 && y == 1)) {
depth += 2;
} else if (x != y) {
depth += 1;
}
return depth;
}
}
Main
๋ณ์)
m, n : ์ธ๋ก, ๊ฐ๋ก๊ธธ์ด
arr : ๊ถค๋ ์ค์น ์ํ
visited : ๋ฐฉ๋ฌธํ์ ๋์ ๋ช ๋ น ํ์
x1, y1, dir1 : ํ์ฌ ์์น, ๋ฐฉํฅ
x2, y2, dir2 : ์ํ๋ ์์น, ๋ฐฉํฅ
result : ์ต์ ๋ช ๋ น ํ์
- ์ธ๋ก ๊ธธ์ด(m), ๊ฐ๋ก๊ธธ์ด(n) ์ ๋ ฅ
- ๊ถค๋ ์ค์น ์ํ ์ ๋ ฅ ํ ์ ์ฅ(arr) ๋ฐ ๋ฐฉ๋ฌธํ์ ๋์ ๋ช ๋ น ํ์๋ฅผ ์ ์ฅํ๋ visited ๋ฐฐ์ด -1๋ก ์ด๊ธฐํ
- ํ์ฌ ์์น์ ๋ฐฉํฅ, ์ํ๋ ์์น์ ๋ฐฉํฅ ์ ๋ ฅ
- ํ์ฌ ์์น์ ์ํ๋ ์์น๊ฐ ์ผ์นํ๋ค๋ฉด ๋ฐฉํฅ๋ง ๊ณ์ฐ/ ์ผ์นํ์ง ์๋ค๋ฉด bfs ํจ์ ํธ์ถ
- ์ต์ ๋ช ๋ น ํ์(result) ์ถ๋ ฅ
bfs
- Queue์ Robot <x ์์น, y ์์น, ๋ฐฉํฅ, ๋ช ๋ น ํ์> ์ ์ฅ
- ์์ ์์น์ ๋ช ๋ น ํ์๋ 0์ด๋ฏ๋ก visited์ 0์ผ๋ก ์ ์ฅ
- queue๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต
: ๋์๋จ๋ถ์ผ๋ก ์ด๋ -> 1์นธ, 2์นธ, 3์นธ ์ด๋ -> ๋ฒ์ ์์ด๋ฉฐ, ๊ถค๋๊ฐ ๊น๋ ค์๋ค๋ฉด
: dirCalc ํธ์ถํ์ฌ ๊ทธ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ๊ธฐ ์ํ ๋ช ๋ น ์ ๊ณ์ฐ
: Robot ๊ฐ์ฒด ๋ง๋ ํ ์์ง ๋ฐฉ๋ฌธํ์ง ์์๊ฑฐ๋, ๋ฐฉ๋ฌธ์ ํ์ง๋ง ๋ช ๋ น ์๊ฐ ๋ ์ ๋ค๋ฉด queue์ ์ถ๊ฐ
: ๋ง์ฝ ๋ก๋ด์ด ์ํ๋ ์์น์ ๋๋ฌํ๋ค๋ฉด ๋ฐฉํฅ์ ์ผ์น์ํค๊ธฐ ์ํด dirCalc ํธ์ถํ์ฌ ๋ช ๋ น ์ ๊ณ์ฐ ํ ์ต์๊ฐ์ผ๋ก ๊ฐ update
: ๋ง์ฝ 2์นธ ์ด๋์ ๋ชปํ๋ฉด 3์นธ๋ ์ด๋ ๋ชปํ๋ฏ๋ก flag๋ฅผ ์ด์ฉํ์ฌ ํ๋จ
- cnt ๋ฐํ
dirCalc
- (๋-์), (๋จ-๋ถ) ๋ฐฉํฅ์ผ๋ก ๋ฐ๊พธ๊ธฐ ์ํด ๋ช ๋ น+2 ๋ฐํ, ๋๋จธ์ง๋ ๋ช ๋ น+1 ๋ฐํ
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 26042_์๋น ์ ๊ตฌ ๋๊ธฐ ์ค (0) | 2023.08.10 |
---|---|
[Baekjoon] 28107_ํ์ ์ด๋ฐฅ (0) | 2023.08.09 |
[Baekjoon] 5464_์ฃผ์ฐจ์ฅ (0) | 2023.08.08 |
[Baekjoon] 11559_Puyo Puyo (0) | 2023.08.07 |
[Baekjoon] 15828_Router (0) | 2023.08.07 |