๋ฌธ์
https://www.acmicpc.net/problem/16930
๋ฌธ์ ์ดํด
N×M์ฒด์ก๊ด์ ๋น ์นธ(.)๊ณผ ๋ฒฝ(#)์ด ์๋ค.- ํ ๋ฒ ์ด๋ํ ๋, ์·ํ·์ข·์ฐ ์ค ํ ๋ฐฉํฅ์ผ๋ก 1์นธ ์ด์
k์นธ ์ดํ๋ฅผ ์ด๋ํ ์ ์๋ค. - ์์์ ์์ ๋์ฐฉ์ ๊น์ง ์ด๋ํ๋ ์ต์ ์๊ฐ์ ๊ตฌํ๋ค.
๋ฌธ์ ํ์ด
BFS๋ฅผ ์ด์ฉํ์ฌ ๊ฐ ์นธ์ ๋๋ฌํ๋ ์ต์ ์๊ฐ์ ๊ธฐ๋กํ๋ค.
์ํ์ข์ฐ(dr, dc) ๋ค ๋ฐฉํฅ์ ๋ํด 1..k์นธ ์ด๋ํ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ํ๋ค.
์ํ ์ ์
map[r][c] = -1: ๋ฏธ๋ฐฉ๋ฌธ,-2: ๋ฒฝ์ผ๋ก ์ด๊ธฐํ- BFS ํ์ํ๋ฉด์ ํด๋น ์นธ์ ๋๋ฌํ ์ต์ ์๊ฐ ์ ์ฅ
ํ์ ์กฐ๊ฑด
- ๋ฏธ๋ฐฉ๋ฌธ:
map[nr][nc] == -1
์ง๊ธ์ด ์ฒ์ ๋๋ฌ์ด๋ฏ๋กmap[nr][nc] = map[cur.r][cur.c] + 1๋ก ๊ฐฑ์ ํ๊ณ ํ์ ๋ฃ๋๋ค.
- ์ด๋ฏธ ๋ ๋น ๋ฅธ ์๊ฐ์ ๋๋ฌ
map[nr][nc] < map[cur.r][cur.c] + 1
์ด ์นธ์๋ ํ์ฌ ์๊ฐ๋ณด๋ค ๋น ๋ฅด๊ฒ ์ด๋ฏธ ์์ผ๋ฏ๋ก, ๊ทธ ๋ค ์นธ๋ค๋ ์ด ๊ฒฝ๋ก๋ณด๋ค ์ด๋์ด ๋ ์ ์๋ค.
→ ์ด ๋ฐฉํฅ ํ์์ ์ค๋จํ๋ค. (break)
- ๊ฐ์ ์๊ฐ์ผ๋ก ์ด๋ฏธ ๋ฐฉ๋ฌธ
map[nr][nc] == map[cur.r][cur.c] + 1- ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ๊ฐ์ ์ด๋ ์๊ฐ์ ์ด๋ฏธ ํ์ ๋ค์ด๊ฐ๋ ์นธ.
- ๋ค์ ํ์ ๋ฃ์ ํ์๋ ์๋ค.
- ํ์ง๋ง ๊ทธ ๋ค ์นธ์ ์์ง ๋ฏธ๋ฐฉ๋ฌธ์ผ ์ ์์ผ๋ฏ๋ก ๊ณ์ ํ์ธํด์ผ ํ๋ค.
→ ์ด๋ฒ ์นธ์ ํจ์คํ๊ณ ๊ฐ์ ๋ฐฉํฅ์ ๋ค์ ์นธ์ผ๋ก ์งํ (continue)
if (map[nr][nc] == -1) { // ๋ฏธ๋ฐฉ๋ฌธ
q.offer(new Point(nr, nc));
map[nr][nc] = map[cur.r][cur.c] + 1;
} else if (map[nr][nc] < map[cur.r][cur.c] + 1) { // ์ด๋ฏธ ํ์ฌ ์๊ฐ๋ณด๋ค ๋นจ๋ฆฌ ๋์ฐฉ.
break;
}
// map[nr][nc] == map[cur.r][cur.c] + 1 ์ด๋ฉด ๊ทธ๋ฅ ๋ค์ ์นธ ๊ณ์
4. ๋์ฐฉ ์ขํ (er, ec)๋ฅผ ๋ง๋๋ฉด ์ฆ์ `return`ํ๋ค. (BFS์ด๋ฏ๋ก ๊ฐ์ฅ ์ฒ์ ๋ฐฉ๋ฌธํ์ ๋๊ฐ ์ต์ ์๊ฐ)
์ฃผ์ ์ฌํญ
๋ฒ์๋ฅผ ๋ฒ์ด๋ฌ๊ฑฐ๋ ๋ฒฝ(#)์ ๋ง๋ฌ์ ๋๋ continue๊ฐ ์๋๋ผ break๋ฅผ ์จ์ผ ํ๋ค.
: ๊ฐ์ ๋ฐฉํฅ์ผ๋ก ์นธ์ ๋๋ ค๊ฐ๋ ๊ณผ์ ์์ ์์ด ๋งํ๋ฉด ๊ทธ ๋ค ์นธ๋ค๋ ์ ๋ถ ๊ฐ ์ ์๊ธฐ ๋๋ฌธ.
→ ์ด ๋ฐฉํฅ ํ์ ์์ฒด๋ฅผ ์ค๋จํด์ผ ํ๋ค.
์ฝ๋
import java.util.*;
import java.io.*;
public class Main {
static class Point {
int r, c;
public Point(int r, int c) {
this.r = r;
this.c = c;
}
}
static int n, m, k, sr, sc, er, ec;
static int[][] map;
static int[] dr = { -1, 1, 0, 0 };
static int[] dc = { 0, 0, -1, 1 };
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
map = new int[n][m];
for (int i = 0; i < n; i++) {
String s = br.readLine();
for (int j = 0; j < m; j++) {
if (s.charAt(j) == '.') {
map[i][j] = -1; // ๋ฏธ๋ฐฉ๋ฌธ
} else {
map[i][j] = -2; // ๋ฒฝ
}
}
}
st = new StringTokenizer(br.readLine());
sr = Integer.parseInt(st.nextToken()) - 1;
sc = Integer.parseInt(st.nextToken()) - 1;
er = Integer.parseInt(st.nextToken()) - 1;
ec = Integer.parseInt(st.nextToken()) - 1;
System.out.println(bfs());
}
static int bfs() {
Queue<Point> q = new LinkedList<>();
map[sr][sc] = 0;
q.offer(new Point(sr, sc));
while (!q.isEmpty()) {
Point cur = q.poll();
for (int i = 0; i < 4; i++) {
for (int j = 1; j <= k; j++) {
int nr = cur.r + dr[i] * j;
int nc = cur.c + dc[i] * j;
if (nr < 0 || nc < 0 || nr >= n || nc >= m || map[nr][nc] == -2)
break;
if (nr == er && nc == ec)
return map[cur.r][cur.c] + 1;
if (map[nr][nc] == -1) { // ๋ฏธ๋ฐฉ๋ฌธ
q.offer(new Point(nr, nc));
map[nr][nc] = map[cur.r][cur.c] + 1;
} else if (map[nr][nc] < map[cur.r][cur.c] + 1) { // ์ด๋ฏธ ํ์ฌ ์๊ฐ ์ดํ๋ก ๋์ฐฉํ์.
break;
}
}
}
}
return map[er][ec];
}
}'๐ญ Problem Solving > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [BOJ][Java] 2533. ์ฌํ๋ง ์๋น์ค(SNS) (0) | 2025.09.24 |
|---|---|
| [BOJ][Java] 15486. ํด์ฌ 2 (0) | 2025.09.15 |
| [BOJ][Java] 14503. ๋ก๋ด ์ฒญ์๊ธฐ (0) | 2025.09.03 |
| [SWEA][Java] 3421. ์์ ๋ฒ๊ฑฐ ์ฅ์ธ (4) | 2025.08.29 |
| [BOJ][Java] 1946. ์ ์ ์ฌ์ (1) | 2025.08.26 |