๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/16509
โธ ๋ฌธ์
์ค๋๋ง์ ํด๊ฐ๋ฅผ ๋์จ ํธ๊ทผ์ด๋ ๋ฌธ๋ ๋์๋ฆฌ๋ฐฉ์ ์๋ ์ฅ๊ธฐ๊ฐ ํ๊ณ ์ถ์ด์ก๋ค. ํ์ง๋ง ์ฅ๊ธฐ๋ฅผ ์ค๋ซ๋์ ํ์ง ์์ ํ์ธ์ง ์์ ์๋ ์ ์ฐ๋ ์์ ์ ๋๋ก ์ฐ๋ ๊ฒ์ด ๋๋ฌด ํ๋ค์๋ค. ํธ๊ทผ์ด๋ฅผ ์ํด ์์ ์ด๋ป๊ฒ ์จ์ผ ํ ์ง ๋์์ฃผ์.
์ ๊ทธ๋ฆผ์ 10×9 ํฌ๊ธฐ์ ์ฅ๊ธฐํ์ ๋ํ๋ด๋ฉฐ, ์์ (5, 4)์, ์์ (1, 4)์ ์๋ฆฌ ์ก๊ณ ์๋ ๊ธฐ๋ฌผ์ด๋ค. (0, 3)๊ณผ (2, 5)๋ฅผ ๊ผญ์ง์ ์ผ๋ก ํ๋ ์ฌ๊ฐํ๊ณผ, (7, 3)๊ณผ (9, 5)๋ฅผ ๊ผญ์ง์ ์ผ๋ก ํ๋ ์ฌ๊ฐํ์ ์์ด ์์นํ ์ ์๋ ๊ถ์ฑ์ด๋ผ๊ณ ํ๋ค. ์์ ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด 8๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์์ง์ผ ์ ์๋๋ฐ, ์, ํ, ์ข, ์ฐ๋ก ํ ์นธ์ ์ด๋ํ ํ์ ๊ฐ์ ๋ฐฉํฅ ์ชฝ ๋๊ฐ์ ์ผ๋ก ๋ ์นธ ์ด๋ํ๋ค.
๋ง์ฝ ์์ด ์ด๋ํ๋ ๊ฒฝ๋ก์ ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ค๋ฅธ ๊ธฐ๋ฌผ์ด ์๋ค๋ฉด ์์ ๊ทธ์ชฝ์ผ๋ก ์ด๋ํ ์ ์๋ค. ๋ํ, ์์ด ์ฅ๊ธฐํ์ ๋ฒ์ด๋ ์๋ ์๋ค.
10×9 ํฌ๊ธฐ์ ์ฅ๊ธฐํ ์์ ์๊ณผ ์์ ์ฒ์ ์์น๊ฐ ์ฃผ์ด์ก์ ๋, ์์ด ์์๊ฒ ๋๋ฌํ ์ ์๋ ์ต์ ์ด๋ ํ์๋ฅผ ๊ตฌํ์ฌ๋ผ.
โธ ์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์๋ ์์ ์์น๋ฅผ ์๋ฏธํ๋ ์ ์ R1, C1์ด ์ฃผ์ด์ง๋ค.
๋ ๋ฒ์งธ ์ค์๋ ์์ ์์น๋ฅผ ์๋ฏธํ๋ ์ ์ R2, C2๊ฐ ์ฃผ์ด์ง๋ค. ์ฅ๊ธฐํ์์ Ri (0 ≤ Ri ≤ 9)๋ ํ์, Ci (0 ≤ Ci ≤ 8)๋ ์ด์ ์๋ฏธํ๋ค.
์์ ํญ์ ๊ถ์ฑ์ ์๋ฆฌ ์ก๊ณ ์์ผ๋ฉฐ, ์๊ณผ ์์ ์์น๋ ๊ฒน์น์ง ์๋๋ค.
โธ ์ถ๋ ฅ
์์ด ์์๊ฒ ๋๋ฌํ ์ ์๋ ์ต์ ์ด๋ ํ์๋ฅผ ์ถ๋ ฅํ๋ค. ๋ง์ฝ ๋๋ฌํ ์ ์๋ค๋ฉด -1์ ์ถ๋ ฅํ๋ค.
๐ ๋ฌธ์ ์ ๋ณด
- ๐ฅ ๋ฌธ์ ๋ ๋ฒจ : ๊ณจ๋ 5
- ๐ ๋ฌธ์ ์ ํ : ๊ตฌํ, ๊ทธ๋ํ ์ด๋ก , ๊ทธ๋ํ ํ์, ๋๋น ์ฐ์ ํ์
- ๐ฌ ํ์ด ์ธ์ด : JAVA
๐ค ๋ฌธ์ ํ์ด
์ ๋ฌธ์ ๋ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ์ ์์น์์ ๋๋น ์ฐ์ ํ์(BFS)์ ์งํํ์ฌ ์์๊ฒ ๋๋ฌํ ์ ์๋ ์ต์ ํ์๋ฅผ ๊ตฌํ ์ ์๋ค.
์ฃผ์ด์ง ๊ท์น์ ๋ฐ๋ผ ์์ ์ด๋ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ค.
๋จผ์ ์ํ์ข์ฐ ๋ฐฉํฅ์ผ๋ก ํ ์นธ ์ด๋ํ๋๋ฐ, ์ด๋ ์ด๋ํ๋ ค๋ ์์น๊ฐ ๋ฒ์ ๋ด์ ์์ผ๋ฉฐ, ๊ทธ ์์น์ ๋ค๋ฅธ ๊ธฐ๋ฌผ์ด ์์ ๊ฒฝ์ฐ์๋ง ์ด๋์ด ๊ฐ๋ฅํ๋ค.
์ด๋ ํ, ํด๋น ์์น์์ ๋ ๊ฐ์ ๋๊ฐ์ ๋ฐฉํฅ์ ๊ฒ์ฌํ๋ค. ๊ฐ ์ํ์ข์ฐ ๋ฐฉํฅ์ ๋ํด ๋ ๊ฐ์ ๋๊ฐ์ ๋ฐฉํฅ์ ๋งค์นญํ์ฌ, ์ฒซ ๋ฒ์งธ ๋๊ฐ์ ์ด๋์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ, ๊ทธ ์์น์์ ๋ ๋ฒ์งธ ๋๊ฐ์ ์ด๋์ ์งํํ๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ์ด๋ ์ด๋ํ๋ ค๋ ์์น๊ฐ ๋ฒ์ ๋ด์ ์์ผ๋ฉฐ, ๊ทธ ์์น์ ๋ค๋ฅธ ๊ธฐ๋ฌผ์ด ์์ ๊ฒฝ์ฐ์๋ง ์ด๋์ด ๊ฐ๋ฅํ๋ค.
๊ท์น์ ๋ฐ๋ผ ์ด๋์ ๋ง์น ํ, ์ต์ข ์ ์ผ๋ก ๋๋ฌํ ์์น๊ฐ ๋ฒ์ ๋ด์ ์๊ณ ๋ฐฉ๋ฌธํ ์ ์๋ ๊ฒฝ์ฐ์๋ง ํ์ ์ถ๊ฐํ์ฌ ํ์์ ๊ณ์ํ๋ค.
ํ์์ ๊บผ๋ธ ํ์ฌ ์์น๊ฐ ์์ ์์น์ ๊ฐ๋ค๋ฉด, ํด๋น ์ด๋ ํ์๋ฅผ ๋ฐํํ๋ค.
๋ง์ฝ ๋ชจ๋ ํ์์ ๋ง์ณค๋๋ฐ๋ ์์ ๋๋ฌํ ์ ์๋ค๋ฉด -1์ ๋ฐํํ๋ค.
์ ํ์ด๋ฅผ ์ฝ๋๋ก ์์ฑํด ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
โ ์ต์ข ์ฝ๋
๋ฉ๋ชจ๋ฆฌ : 11592KB
์๊ฐ : 64ms
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 Main {
static final int n = 10, m = 9; // ์ฅ๊ธฐํ ํฌ๊ธฐ
static int r, c;
static int r2, c2;
static boolean[][] checked;
static public class Pos {
int x; int y; int cnt;
public Pos(int x, int y, int cnt) {
this.x = x; this.y = y; this.cnt = cnt;
}
}
// ์ฐํ์ข์
static int[] dx = {0, 1, 0, -1};
static int[] dy = {1, 0, -1, 0};
// ๋๊ฐ์
static int[] zx = {-1, 1, 1, -1};
static int[] zy = {1, 1, -1, -1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
// ์์ ์์น
r = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
// ์์ ์์น
r2 = Integer.parseInt(st.nextToken());
c2 = Integer.parseInt(st.nextToken());
checked = new boolean[n][m];
int ans = bfs(r, c);
System.out.println(ans);
}
private static int bfs(int r, int c) {
Queue<Pos> que = new LinkedList<>();
checked[r][c] = true;
que.offer(new Pos(r, c, 0));
while (!que.isEmpty()) {
Pos now = que.poll();
if (now.x == r2 && now.y == c2) { // ์ ๋ง์ฃผ์น๋ฉด ์ด๋ํ์ ๋ฐํ
return now.cnt;
}
for (int d = 0; d < 4; d++) {
// ๋จผ์ ์ํ์ข์ฐ์ ๋ฐ๋ผ ํ ์นธ ์ด๋
int nx = dx[d] + now.x;
int ny = dy[d] + now.y;
if (isPossible(nx, ny)) {
for (int cnt = 0; cnt < 2; cnt++) { // ๋ ๊ฐ์ ๋๊ฐ์ ๋ฐฉํฅ ํ์
// ์ด๋ ๋ฐฉํฅ
int z = (d+cnt) % 4;
// ๋๊ฐ์ ์ผ๋ก ํ ์นธ ์ด๋
int nzx = nx + zx[z];
int nzy = ny + zy[z];
if (isPossible(nzx, nzy)) {
// ๊ธฐ๋ฌผ์ด ์๋ค๋ฉด ๋๋จธ์ง ํ ์นธ ์ด๋
nzx += zx[z];
nzy += zy[z];
if (rangeCheck(nzx, nzy) && !checked[nzx][nzy]) {
que.offer(new Pos(nzx, nzy, now.cnt+1));
checked[nzx][nzy] = true;
}
}
}
}
}
}
return -1;
}
// ์ด๋ ๊ฐ๋ฅํ์ง ํ์ธ
private static boolean isPossible(int x, int y) {
if (x == r2 && y == c2) return false; // ์์ด ์ด๋ํ๋ ๊ฒฝ๋ก์ ์์ด ์์ผ๋ฉด ๊ทธ ๋ฐฉํฅ์ผ๋ก ์ด๋ ๋ถ๊ฐ
return rangeCheck(x, y); // ๋ฒ์ ๋ด์ ์๋์ง ํ์ธ
}
private static boolean rangeCheck(int x, int y) {
return x >= 0 && x < n && y >= 0 && y < m;
}
}
์ํ์ข์ฐ ์ด๋์ ๋ฐ๋ผ ๋๊ฐ์ ๋ฐฉํฅ ์ด๋์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด ์ค์ผ ํ ์ง ๊ฝค ๊ณ ๋ฏผํ๋ค.
dx, dy ๋ฐฐ์ด๊ณผ zx, zy ๋ฐฐ์ด์ ๊ฐ ์ํ์ข์ฐ ๋ฐฉํฅ์ ๋ํด ๋ ๊ฐ์ ๋๊ฐ์ ๋ฐฉํฅ๊ณผ ๋งค์นญํ ์ ์๋๋ก ์ค์ ํ๋ค.
์ดํ, z = (d + cnt) % 4 ๋ฐฉ์์ผ๋ก ๊ฐ ์ํ์ข์ฐ ๋ฐฉํฅ์ ๋ํด ๋ ๊ฐ์ ๋๊ฐ์ ๋ฐฉํฅ์ ์์ฐจ์ ์ผ๋ก ํ์ํ๋๋ก ๊ตฌํํ๋ค.
์ด ๋ฐฉ์์ผ๋ก ๊ฐ ์ํ์ข์ฐ ๋ฐฉํฅ์ ๋ํด ๋ ๊ฐ์ ๋๊ฐ์ ๋ฐฉํฅ์ ์ฐจ๋ก๋ก ํ์ํ๋ ๋ก์ง์ ๊ฐํธํ๊ฒ ๊ตฌ์ฑํ ์ ์์๋ค.
์ค๋๋ง์ BFS ๋ฌธ์ ๋ฅผ ํ์ด์ ๊ทธ๋ฐ์ง ์ฌ๋ฐ๊ฒ ํ๋ฉด์ ์ฌ๋ฐ์๋ค. ๊ทธ๋ฐ ๊น์ ํฌ์คํ ๊น์ง ์๋ฃ ! ๐ ๐ฅ
๋ฐ๋ฆฐ ๋๋จธ์ง ํฌ์คํ ๋ ์ผ๋ฅธ ํด์ผ์ง..๐
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Boj_22254] ๊ณต์ ์ปจ์คํดํธ ํธ์ (1) | 2025.02.07 |
---|---|
[Boj_5214] ํ์น (0) | 2025.01.31 |
[Boj_1854] K๋ฒ์งธ ์ต๋จ๊ฒฝ๋ก ์ฐพ๊ธฐ (0) | 2025.01.25 |
[Boj_20444] ์์ข ์ด์ ๊ฐ์ (1) | 2025.01.20 |
[Boj_20183] ๊ณจ๋ชฉ ๋์ฅ ํธ์ - ํจ์จ์ฑ 2 (0) | 2025.01.18 |