์ง๊ธ๊น์ง ๋ด๊ฐ BFS ๋ก ๋ฌธ์ ๋ฅผ ํผ ๋ ๋ฌธ์ ๋ฅผ ์๋ก ์ฐ๊ฒฐํด์
๋ฌธ์ ํด๊ฒฐ์ ํ์ํ ์ฌ๊ณ ๋ฐฉ์๊ณผ ๋ ผ๋ฆฌ๋ฅผ ์์ ํ ์ ๋ฆฌํ ๊น ํ๋ค.
์ด๋ฌํ ์ ๋ฆฌ๋ฅผ ํตํด์ ๋ค๋ฅธ ๋ฌธ์ ์๋ ํ์ฅํด์ ์ธ ์ ์๋๋ก
์ธ์ฐ๋ ํฌ์ธํธ์ ์ฌ๊ณ ๊ณต์๋ ๊ฐ์ด ์ ๋ฆฌํ ๊ฒ์ด๋ค.
์ฒซ ๋ฒ์งธ ๋ฌธ์ : ๊ฐ ์ ์๋ ๊ธธ์ ํตํด ๋ชฉ์ ์ง ๋๋ฌํ๊ธฐ.
0 1 2 3
+---+---+---+---+
0 | S | โ | O | O |
+---+---+---+---+
1 | O | O | O | โ |
+---+---+---+---+
2 | โ | โ | O | โ |
+---+---+---+---+
3 | O | O | O | G |
+---+---+---+---+
(0,0)์์ ์ถ๋ฐํ์ฌ (3, 3)์ธ ๋์ฐฉ์ ์ผ๋ก ๊ฐ์ผํ๋ค.
์กฐ๊ฑด์ ๋์ ๊ฐ๊ณ ํ ์นธ์ฉ๋ง ๊ฐ ์ ์๋ค.
๊ทธ๋์ ๊ฐ ์ ์๋ ๊ธธ์ธ์ง, ๋จผ์ ํ์ธํ๊ณ ํ๋์ฉ ์ค ์ธ์์ ์ด๋ํด์ผ ํ๋ค.
์ ๋ต ์ฝ๋
package -
import java.util.*;
public class MazeSolver {
static int N = 4;
static int[][] maze = {
{1, 0, 1, 1},
{1, 1, 1, 0},
{0, 0, 1, 0},
{1, 1, 1, 1}
}
// ์, ์ฐ, ํ, ์ข
static int[] dx = {-1, 0, 1, 0};
static int[] dy = {0, 1, 0, -1};
public static void main(String[] args) {
boolean result = bfs(0, 0);
System.out.println(result ? "๋ฏธ๋ก ํ์ถ ์ฑ๊ณต" : "๋ฏธ๋ก ํ์ถ ์คํจ!");
}
static boolean bfs(int startX, int startY){
Queue <int[]> queue = new LinkedList<>();
boolean[][] visited = new boolean[N][N];
queue.add(new int[]{startX, startY});
visited[startX][startY] = true;
while (!queue.isEmpty()){
int[] current = queue.poll();
int x = current[0];
int y = current[1];
if (x == N-1 && y == N-1) return true;
for (int i = 0; i < 4 ; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < N && ny >= 0 && ny < N
&& !visited[nx][ny] && maze[nx][ny] == 1) {
queue.add(new int[]{nx,ny});
visited[nx][ny] = true;
}
}
}
return false; // ๋์ฐฉํ์ง ๋ชปํจ
}
}
๋ ๋ฒ์งธ ๋ฌธ์ : ์ ์ ํ๋ ฌ์์ ์์ ์์ญ ์ฐพ๊ธฐ
๋ฌธ์ ์ค๋ช :
N×N ํฌ๊ธฐ์ ์ ์ ํ๋ ฌ์ด ์๋ค.
๊ฐ ์นธ์๋ ๊ทธ ์ง์ ์ ๋์ด๊ฐ ์ ํ ์๋ค.
๋น๊ฐ ๋ด๋ ค ํน์ ๋์ด ์ดํ์ ๋ชจ๋ ์ง์ ์ด ๋ฌผ์ ์ ๊ธด๋ค๊ณ ๊ฐ์ ํ ๋,
๋ฌผ์ ์ ๊ธฐ์ง ์๋ ์์ ํ ์์ญ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด๋ผ.
์์ ํ ์์ญ์ด๋ ๋ฌผ์ ์ ๊ธฐ์ง ์์ ์ง์ ๋ค์ด ์ํ์ข์ฐ๋ก ์ฐ๊ฒฐ๋ ์์ญ์ ์๋ฏธํ๋ค.
์ ๋ ฅ:
- ์ฒซ ๋ฒ์งธ ์ค์ ํ๋ ฌ์ ํฌ๊ธฐ N์ด ์ฃผ์ด์ง๋ค. (1 ≤ N ≤ 100)
- ๋ค์ N๊ฐ ์ค์๋ ๊ฐ ์ง์ ์ ๋์ด๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ ๋์ด ≤ 100)
์ถ๋ ฅ:
๋ฌผ์ ์ ๊ธฐ๋ ๋์ด๋ณ๋ก ์์ ํ ์์ญ์ ์ต๋ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
๋์ด ์ ๋ณด๊ฐ ์ฃผ์ด์ง ์ง๋์์, ํน์ ๋น ๋์ด ์ดํ์ ์นธ์ ๋ฌผ์ ์ ๊ธด๋ค๊ณ ํ ๋, ๋ฌผ์ ์ ๊ธฐ์ง ์๊ณ ์ฐ๊ฒฐ๋ ์์ ์์ญ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ผ.
-> ๋์ด๋ณ๋ก ์ง๋๋ฅผ BFS ํ์ํ์ฌ
-> ์ฐ๊ฒฐ๋ ์์ ์์ญ์ ์๋ฅผ ์ธ๊ณ , ๊ทธ ์ค ๊ฐ์ฅ ํฐ ๊ฐ์ ์ถ๋ ฅ!
์ ๋ต์ฝ๋
package -
import java.util.*;
public class SafeZone {
// ๋ฐฉํฅ ๋ฐฐ์ด : ์, ์ฐ, ํ, ์ข
static int[] dx = {-1, 0, 1, 0};
static int[] dy = {0, 1, 0, -1};
// ํ๋ก๊ทธ๋จ์ ์์์ , ์ฌ๊ธฐ์ ์
๋ ฅ ๋ฐ๊ณ ์ ์ฒด ๋ก์ง์ ์คํ - ์ ์ญ ๋ณ์ ์ ์ธ
static int N; // ์ง๋์ ํฌ๊ธฐ
static int[][] map; // ์ง๋์ ๋์ด ์ ๋ณด
static boolean[][] visited; // BFS์์ ๋ฐฉ๋ฌธ ์ฌ๋ถ ์ฒดํฌ
public static void main(String[] args) {
// ์
๋ ฅ - ์ง๋ ํฌ๊ธฐ ๋ฐ map ๊ฐ ์
๋ ฅ์ ์ฌ์ฉ
Scanner sc = new Scanner(System.in);
N = sc.nextInt(); // ์ง๋ ํฌ๊ธฐ(N * N)๋ฅผ ์ค์ , ์ดํ 2์ฐจ์ ๋ฐฐ์ด ์์ฑ์ ์ฌ์ฉ๋จ.
map = new int[N][N]; // 2์ฐจ์ ๋ฐฐ์ด ์ ์ธ, ๋ณ์ ์ด๊ธฐํ. map์ ๊ฐ ์นธ์ ๋์ด ์ ์ฅ.
int maxHeight = 0; // ์
๋ ฅ ์ค ๊ฐ์ฅ ๋์ ์ง์ ์ ๊ธฐ์ต. ์ด๊ฑด ๋์ด๋ณ ์๋ฎฌ๋ ์ด์
๋ฒ์ ์ง์ ์ ์ฌ์ฉ๋จ
// ๊ฐ ์นธ๋ง๋ค ๋ค๋ฅธ ๋์ด ์
๋ ฅ ๋ฐ๊ธฐ, ์ดํ ๋น ๋์ด ๋ฒ์๋ฅผ ์ ํ๋๋ฐ ํ์
for (int i = 0; i < N; i++) {
for (int j = 0; j < N ; j++) {
// map[i][j]์ ์
๋ ฅ ์ ์ฅํ๊ณ ๋์์ maxHeight ๊ฐฑ์
map[i][j] = sc.nextInt();
maxHeight = Math.max(maxHeight, map[i][j]);
}
}
// ๊ฐ ๋์ด์์ ์ฐธ์ํ safe zone ์ค ์ต๋๊ฐ ์ ์ฅ์ฉ
int maxSafeZones = 0;
// ๋น์ ๋์ด๋ฅผ 0๋ถํฐ maxHeight๊น์ง ๋ชจ๋ ์๋ฎฌ๋ ์ด์
- ์กฐ๊ฑด์ ๋ฐ๋ผ ์ ๊ธฐ์ง ์์ ์ง์ญ ํ๋จ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉ๋จ
for (int height = 0; height <= maxHeight; height++) {
visited = new boolean[N][N]; // ํ์ฌ height ์๋ฎฌ๋ ์ด์
๊ธฐ์ค ๋ฐฉ๋ฌธ ์ฒดํฌ
int safeZones = 0; // ํ์ฌ ๋์ด์์์ ์์ ์์ญ ๊ฐ์
// ๋ชจ๋ ์นธ์ ์ํํ๋ฉฐ ์์ ์์ญ์ ์์์ ์ ์ฐพ๊ธฐ ์ํจ
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
// ๋ฐฉ๋ฌธ ์ ํ๊ณ , ๋ฌผ์ ์ ๊ธฐ์ง ์์ ์นธ์ด๋ผ๋ฉด bfs()ํ์์ผ๋ก ์ฐ๊ฒฐ๋ ์์ญ ๋ชจ๋ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
if (!visited[i][j] && map[i][j] > height) {
bfs(i, just, height);
safeZones++; // ๋ฉ์ด๋ฆฌ ํ๊ฐ ๋ฐ๊ฒฌ!
}
}
}
// ํ์ฌ height์์ ์ฐพ์ safe zone ๊ฐ์๊ฐ ์ต๋์ด๋ฉด ๊ฐฑ์
maxSafeZones = Math.max(maxSafeZones, safeZones);
}
System.out.println(maxSafeZones);
}
// ์ด์ BFS ํจ์ ๋ค์ด๊ฐ์
// startX,startY์์๋ถํฐ ์์ํ๋ ์์ ์์ญ ์ ์ฒด๋ฅผ ํ์ - main์์ ์์ญ ์ฐพ์ ๋ ํธ์ถ๋จ
static void bfs(int starX, int starY, int height) {
Queue<int[]> queue = new LinkedList<>();
queue.offer(new int[]{startX, startY}); //ํ์ ์์์ ์ถ๊ฐ
visited[startX][startY] = true; // ๋ฐฉ๋ฌธ ์ฒดํฌ
// ํ์์ ํ๋ ๊บผ๋ด์ ํ์ฌ ์ขํ ์ ์ฅ
while (!queue.isEmpty()){
int[] current = queue.poll();
int x = current[0];
int y = current[1];
// ์์ฐํ์ข ๋ฐฉํฅ์ผ๋ก ๋ค์ ์นธ ํ์ธ
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
// ๋ฒ์ ์์ ์๊ณ ๋ฐฉ๋ฌธํ์ง ์์๊ณ ๋ฌผ์ ์ ๊ธฐ์ง ์์์ผ๋ฉด ํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
if (nx >= 0 && nx < N && ny >= 0 && ny < N
&& !visited[nx][ny] && map[nx][ny] > height) {
queue.offer(new int[]{nx, ny});
visited[nx][ny] = true;
}
}
}
}
}
๋ ๋ฒ์งธ ๋ฌธ์ ์ ์ ์ฒด ๋ ผ๋ฆฌ ํ๋ฆ ์์ฝ!
1. ์ ๋ ฅ : N*N ์ ์ ํ๋ ฌ(map)์ ์ ๋ ฅ ๋ฐ๊ณ , ๊ฐ์ฅ ๋์ ๋์ด(maxHeight)๋ ๊ตฌํจ
2. ๋ฐ๋ณต : ๋น์ ๋์ด(height)๋ฅผ 0๋ถํฐ maxHeight๊น์ง ํ๋์ฉ ๋ฐ๊ฟ๊ฐ๋ฉฐ ๋ฐ๋ณต
์๋ก ์ํ์ข์ฐ๋ก ์ฐ๊ฒฐ๋ ๋ธ๋ญ์ ํ๋์ ์์ ์์ญ(๋ฉ์ด๋ฆฌ)๋ก ์ผ๋ค.
๊ทธ๋์ ๋น์ ๋์ด๊ฐ ๋์์๋ก ์์ ์์ญ์ด ๋ง์๊ฒ์ด ์๋๋ผ
๋น์ ๋์ด์ ๋ฐ๋ผ ์ํ์ข์ฐ ์ฐ๊ฒฐ๋๋ ๋ฉ์ด๋ฆฌ์ ๊ฐ์๊ฐ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์
์ด๋ ๊ฒ ๋ฐ๋ณตํ์ฌ ๋ฉ์ด๋ฆฌ ์ฆ, ์์ ์์ญ ๊ฐ์๊ฐ ์ด๋ค ๋์ด์์ ๊ฐ์ฅ ๋ง์์ง๋ฅผ ์ธ๋ ๊ฒ์ด๋ค.
3. BFS: ํ์ฌ ๋์ด์์ ๋ฌผ์ ์ ๊ธฐ์ง ์์ ์์ ์์ญ์ BFS๋ก ํ์
4. ์์ญ ์ ์ธ๊ธฐ : ๊ฐ height๋ง๋ค ์์ ์์ญ์ ๊ฐ์(safeZones)๋ฅผ ์ธ๊ณ ์ต๋๊ฐ ์ ์ฅ
5. ์ถ๋ ฅ : ๊ฐ์ฅ ๋ง์ ์์ ์์ญ ๊ฐ์๋ฅผ ์ถ๋ ฅ.
1. BFS ๋ ๋ฌธ์ ์ ๊ณตํต์ ๊ณผ ์ฐจ์ด์
ํญ๋ชฉ | ๋ฏธ๋ก ํ์ถ | ์์ ์์ญ |
๋ชฉํ | (0,0) → (N-1,N-1) ๋๋ฌ ์ฌ๋ถ | ๋ฌผ์ ์ ๊ธฐ์ง ์์ “์์ ์์ญ”์ ๊ฐ์ |
๋ฐฉ์ | BFS๋ก ํ ๋ฒ๋ง ํ์ | BFS๋ฅผ ์ฌ๋ฌ ๋ฒ ๋๋ ค์ “์ฌ๋ฌ ์์ญ”์ ์ |
๊ณตํต์ | ๋ฐฉํฅ ๋ฐฐ์ด ์ฌ์ฉ, ํ ์ฌ์ฉ, ๋ฐฉ๋ฌธ ์ฒดํฌ, BFS ๊ตฌ์กฐ ๋์ผ | |
์ฐจ์ด์ | ๋ชฉ์ ์ง ๋๋ฌ์ด๋ฉด ๋ | ๋์ด๋ง๋ค ๋ฐ๋ณตํด์ ์์ญ ๊ฐ์ ์ |
์กฐ๊ฑด | maze[nx][ny] == 1 | map[nx][ny] > ๋ฌผ๋์ด(height) |
2.1 ์ฒซ ๋ฒ์งธ ๋ฌธ์ ์์ ์ฌ์ฉ๋ ์ปดํจํฐ ์ฌ๊ณ ๋ฐฉ์ ํต์ฌ 3๊ฐ์ง
2.1.1 ์ํํํ
๋ฏธ๋ก๋ฅผ 2์ฐจ์ ๋ฐฐ์ด๋ก ํํ(maze[x][y])
๋ฐฉ๋ฌธ ์ฌ๋ถ๋ visited[x][y]๋ก ํํ
Queue์ ์ขํ [x, y]๋ฅผ ๋ฃ์ผ๋ฉฐ ํ์ฌ ์ํ๋ฅผ ์ ์ฅ
2.1.2 ๊ฒฝ๋ก ํ์ (ํ์ ์๊ณ ๋ฆฌ์ฆ ์ ์ฉ)
BFS๋ฅผ ์ฌ์ฉํด ๋ค ๋ฐฉํฅ(์ํ์ข์ฐ)์ผ๋ก ๊ฐ ์ ์๋์ง ๋ฐ๋ณต ํ์ธ
๋จผ์ ๋๋ฌ ๊ฐ๋ฅํ ์์น๋ถํฐ ๋๊ฒ ํผ์ง๋ฏ์ด ํ์.
2.1.3 ์ข ๋ฃ ์กฐ๊ฑด ์ค์
๋์ฐฉ์ (N-1, N-1)์ ๋๋ฌํ๋ฉด ์ฆ์ true ๋ฐํ
ํ๊ฐ ๋ชจ๋ ๋น์๋๋ฐ ๋์ฐฉ์ ์ ๋๋ฌ ๋ชปํ๋ฉด false ๋ฐํ
2.2 ๋๋ฒ์งธ ๋ฌธ์ ์์ ์ฌ์ฉ๋ ์ปดํจํฐ์ ์ฌ๊ณ ๋ฐฉ์ ํต์ฌ 3๊ฐ์ง
2.2.1 ์์ ํ์(Brute Force )
- ๋ชจ๋ ๋์ด(0๋ถํฐ ์ต๊ณ ๋์ด๊น์ง)๋ฅผ ํ๋ํ๋ ๋ค ์ํํด๋ด
- ๋์ด๋ง๋ค BFS๋ก ์ ์ฒด ์์ญ์ ์๋ก ํ์
2.2.2 BFS (๋๋น ์ฐ์ ํ์)
- ๊ฐ ์์ ํ ์์ญ์ ์ฐ๊ฒฐ๋ ์นธ๋ค์ ์งํฉ์ด๋ฏ๋ก BFS๋ก ์ฐ๊ฒฐ๋ ์นธ๋ค์ ํ ๋ฒ์ ํ์
- ํ์์ด ํ ๋ฒ ๋๋๋ฉด "์์ญ 1๊ฐ ๋ฐ๊ฒฌ"
2.2.3 ์๋ฎฌ๋ ์ด์
- ๋น๊ฐ ์์ ๋ ์ํฉ์ ๊ฐ์ ํด์ ์๋ฎฌ๋ ์ด์ ํ๋ ๋ฌธ์
- map ๋ฐฐ์ด์ ๋ฐ๊พธ์ง ์๊ณ , visited์ height๋ก ์ํ๋ฅผ ์๋ฎฌ๋ ์ด์
3.1 ์ฒซ ๋ฒ์งธ ๋ฌธ์ ์ ์ฌ๊ณ ํ๋ฆ ์ ๋ฆฌ
3.1.1 ๋ฏธ๋ก๊ฐ ์ฃผ์ด์ก์ ๋ ์ด๋ป๊ฒ ํ์ํ ๊น? - ์ํ์ข์ฐ๋ก ์ด๋ ๊ฐ๋ฅํจ
3.1.2 ์ด๋์ ์์ํ๊ณ ์ด๋๊น์ง ๊ฐ์ผ ํ์ง? - (0,0)์์ (N-1, N-1)๊น์ง ๋๋ฌํด์ผ ํจ
3.1.3 ์ด๋ฏธ ๊ฐ๋ ์นธ์ ๋ค์ ๊ฐ์ง ์๊ฒ ํ๋ ค๋ฉด? - visited[x][y] ๋ฐฐ์ด ์ฌ์ฉ
3.1.4 ์ด๋ค ์์๋ก ์นธ๋ค์ ํ์ธํ์ง? - BFS๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๊น์ด ์นธ๋ถํฐ ํ์
3.1.5 ๋์ฐฉ์ง์ ๋๋ฌํ๋ฉด?-> ํ์ ์ข ๋ฃํ๊ณ true ๋ฐํ
3.2 ๋๋ฒ์งธ ๋ฌธ์ ์ ์ฌ๊ณ ํ๋ฆ ์ ๋ฆฌ(์๊ฐ ์์)
3.2.1 "๋น๊ฐ ์ผ๋ง๋ ์ฌ๊น" -> ๋ชจ๋ ๋์ด๋ฅผ ๋ค ์๋ํด๋ณด์.
3.2.2 "๋ฌผ์ด ์ด๋งํผ ์ฐจ๋ฉด ์ด๋๊ฐ ์ ๊ธธ๊น" -> map[x][y] <= height๋ฉด ์ ๊น.
3.2.3 "์ ๊ธฐ์ง ์์ ์นธ๋ค์ ์ฐ๊ฒฐ๋ผ ์์๊น" -> ์ํ์ข์ฐ ํ์ ํ์.
3.2.4 "ํ๋์ ๋ฉ์ด๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ์ฐพ์ง?" -> BFS/DFS๋ก ๋ฉ์ด๋ฆฌ ํ๋๋ฅผ ์ฐพ์!
3.2.5 "์ด๊ฑธ ๋์ด๋ณ๋ก ๋ฐ๋ณตํ๋ฉด ๋๊ฒ ๋ค!"
4.1 ์ฒซ ๋ฒ์ฌ ๋ฌธ์ ์ ์ํ์ ์ฌ๊ณ (๊ทธ๋ํ ์ด๋ก ๊ธฐ๋ฐ)
4.1.1 2์ฐจ์ ๋ฐฐ์ด์ ๊ทธ๋ํ์ ํํ๋ก ๋ชจ๋ธ๋ง ๊ฐ๋ฅ
4.1.2 ๊ฐ ์นธ์ ๋ ธ๋, ์ํ์ข์ฐ๋ ๊ฐ์
4.1.3 BFS๋ ๊ทธ๋ํ์์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฐ ์ต์ ํ๋ ์๊ณ ๋ฆฌ์ฆ
4.1.4 ์ถ๋ฐ์ ๋ถํฐ ๊ฐ์ ํ๋์ฉ ํ๋ฉด์ ํผ์ ธ๋๊ฐ๋ ๋ฐฉ์์ผ๋ก ๋์ฐฉ์ ์ ๊ฐ์ฅ ๋จผ์ ๋๋ฌํ๋ ๊ฒฝ๋ก๋ฅผ ์ฐพ์
4.2 ๋ ๋ฒ์งธ ๋ฌธ์ ์ ์ํ์ ์ฌ๊ณ (๊ทธ๋ํ ์ด๋ก ๊ธฐ๋ฐ)
4.2.1 2์ฐจ์ ๋ฐฐ์ด์ ๊ทธ๋ํ์ฒ๋ผ ์ฐ๊ฒฐ๋ ์ ์ ์ ์งํฉ
4.2.2 ๊ฐ ์นธ์ ์ ์ , ์ํ์ข์ฐ๋ ๊ฐ์
4.2.3 "๋ฌผ์ ์ ๊ธฐ์ง ์์ ์นธ"๋ง ๋จ๊ธด ๊ทธ๋ํ๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ์์์ ์ฐ๊ฒฐ๋ ์ปดํฌ๋ํธ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ !
5.1 ์ฒซ ๋ฒ์งธ ๋ฌธ์ ์ ์ฝ๋ ์ธ์ฐ๊ธฐ ํฌ์ธํธ ์์ฝ
5.1.1 ๋ฐฉํฅ ๋ฐฐ์ด- ์์ฐํ์ข ์์
int[] dx = {-1, 0, 1, 0};
int[] dy = {0, 1, 0, -1};
5.1.2 ์๋ฃ ์ค๋น - ์ค(Queue)๊ณผ ๋ฐ์๊ตญ ๋ฐฐ์ด ๋ง๋ค๊ธฐ
Queue<int[]> queue = new LinkedList<>();
boolean[][] visited = new boolean[N][N];
5.1.3 ์์์ ํ์ ์ถ๊ฐ - ์ถ๋ฐ์ ์ ํ์ ๋ฃ๊ณ , ๋ฐฉ๋ฌธ ํ์
queue.add(new[]{startX,startY});
visited[startX][startY] = true;
๋ฒ์ ์์ด๊ณ , ๋ฐฉ๋ฌธ ์ ํ๊ณ , ๊ธธ์ด๋ฉด => ํ์ ์ถ๊ฐ + ๋ฐฉ๋ฌธ ํ์
5.1.4 ํ๊ฐ ๋น ๋๊น์ง BFS ํ์ - ์ค์์ ๊บผ๋ด๊ณ , ๋์ฐฉํ์ผ๋ฉด true
while (!queue.isEmpty()) {
int[] current = queue.poll();
int x = current[0];
int y = current[1];
if (x == N -1 && y = N -1) return true;
5.1.5 ๋ค ๋ฐฉํฅ์ผ๋ก ์ด๋ - ๋ฒ์ ์์ด๊ณ , ๋ฐฉ๋ฌธ ์ ํ๊ณ , ๊ธธ์ด๋ฉด -> ํ์ ์ถ๊ฐ + ๋ฐฉ๋ฌธ ํ์
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx>=0 && nx < N && ny >= 0 && ny < N
&& !visited[nx][ny] && maze[nx][ny] ==1){
queue.offer(new int[]{nx,ny});
visited[nx][ny] = true;
}
}
}
5.1.6 ๋ค ๋์๋๋ฐ ๋์ฐฉ ๋ชปํ๋ฉด false
return false;
5.2 ๋ ๋ฒ์งธ ๋ฌธ์ ์ ์ฝ๋ ์ธ์ฐ๊ธฐ ํฌ์ธํธ ์์ฝ
5.2.1 ๋ฐฉํฅ ๋ฐฐ์ด - ์, ์ฐ, ํ, ์ข ์์๋๋ก ์์ง์ผ ์ ์๊ฒ ์ค์ !
x↓ y→
0 1 2 3
+---+---+---+---+
0 | | | | |
+---+---+---+---+
1 | | | | |
+---+---+---+---+
2 | | | | |
+---+---+---+---+
3 | | | | |
+---+---+---+---+
// ์ ํ ์ฐ ์ข
int[] dx = {-1, 0, 1, 0};
int[] dy = {0, 1, 0, -1};
5.2.2 ๋์ด๋ณ ์ ์ฒด ๋ฐ๋ณต
for (int height = 0; height <= maxHeight; height++) {
visited = new boolean[N][N];
safeZones = 0;
// ์ ์ฒด map ํ์ํด์ ์์ง ๋ฐฉ๋ฌธ ์ ํ๊ณ ๋ฌผ์ ์ ์ ๊ธด ์นธ์์ BFS
}
๊ฐ ๋์ด๋ง๋ค ์๋ก visited ์ด๊ธฐํ
ํ ์นธ์ด๋ผ๋ BFS ์์ํ๋ฉด safeZone++
5.2.3 BFS ๊ตฌ์กฐ๋ ๋ฏธ๋ก์์ ์ผ๋ ๊ฑฐ๋ ๋๊ฐ์!
Queue<int[]> queue = new LinkedList<>();
queue.offer(new int[]{x, y});
visited[x][y] = true;
๊บผ๋ด๋ฉด์ ๋ค ๋ฐฉํฅ ์ฒดํฌ
์กฐ๊ฑด ๋ง์ผ๋ฉด ์ค์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ.
6. ์๊ธฐํ๋ ๋๋ง์ ๊ณต์
6.1 ์ฒซ๋ฒ์งธ ๋ฌธ์
1. ๋ฐฉํฅ ๋ฐฐ์ด ๋จผ์ ๋ง๋ค๊ธฐ
2. ์ค๊ณผ ๋ฐฉ๋ฌธ ๋ฐฐ์ด ๋ง๋ค๊ธฐ
3. ์์์ ํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ํ์
4. ์ค ๋น ๋๊น์ง ๋ฐ๋ณต:
- ํ๋ ๊บผ๋ด์ ํ์ฌ ์์น ํ์ธ
- ๋์ฐฉ์ ์ด๋ฉด true ๋ฐํ
- ๋ค ๋ฐฉํฅ ํ์ธ : ๊ฐ ์ ์์ผ๋ฉด ํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
5. ๋์ฐฉ ๋ชป ํ์ผ๋ฉด false
6.2 ๋๋ฒ์งธ ๋ฌธ์
1. maxHeight๊น์ง height ํ๋์ฉ ๋๋ ค
2. visited ๋ฐฐ์ด์ ๋์ด๋ง๋ค ์๋ก ๋ง๋ค๊ณ
3. ๋ชจ๋ ์นธ์ ๋๋ฉฐ, ์ ์ ๊ฒผ๊ณ , ๋ฐฉ๋ฌธ ์ํ์ผ๋ฉด BFS ์์! , safeZone++
4. BFS๋ ๋ค ๋ฐฉํฅ ๋๋ฉฐ, ๋ฒ์ ์, ๋ฐฉ๋ฌธ ์ ํ๊ณ , height๋ณด๋ค ๋์ ๊ณณ์ด๋ฉด ์ค์ ์ถ๊ฐ
5. height๋ณ safeZone ์ต๋๊ฐ ์ถ๋ ฅ
7. ์ด ๋ฌธ์ ์์ ๋ฐฐ์ด ๋ ผ๋ฆฌ๋ฅผ ๋ค๋ฅธ ๋ฌธ์ ์ ํ์ฉํ ์ ์๋ BFS ๋ฌธ์ ํจํด
๋ฌธ์ | ํต์ฌ๊ฐ๋ |
์ฌ์ ๊ฐ์ (๋ฐฑ์ค 4963) https://www.acmicpc.net/problem/4963 |
์ฐ๊ฒฐ๋ ๋ฉ์ด๋ฆฌ ๊ฐ์ ์ธ๊ธฐ (๋ฌผ ๋์ ๋ฐ๋ค) |
๋จ์ง ๋ฒํธ ๋ถ์ด๊ธฐ (๋ฐฑ์ค 2667) https://www.acmicpc.net/problem/2667 |
1๋ก ์ฐ๊ฒฐ๋ ์ง ๊ทธ๋ฃน ์ธ๊ธฐ |
๋ฏธ๋ก ํ์ (2178) https://www.acmicpc.net/problem/2178 |
์ต๋จ๊ฑฐ๋ฆฌ ํ์ |
์ ๊ธฐ๋ ๋ฐฐ์ถ (1012) https://www.acmicpc.net/problem/1012 |
๋ฐฐ์ถ ๋ญ์น ๊ฐ์ (DFS/BFS) |
๋ฐ์ด๋ฌ์ค ํผ์ง๊ธฐ | ๊ฐ์ผ ์๋ฎฌ๋ ์ด์ (ํ, visited, ์กฐ๊ฑด) |