π€ BFS ( Breadth First Search ) λλΉ μ°μ νμ?
κ·Έλν νμ μκ³ λ¦¬μ¦μ νλλ‘, λ£¨νΈ λ Έλμμ μμνμ¬ μΈμ ν λ Έλλ₯Ό λ¨Όμ νμνλ λ°©λ²μ λλ€.
μμ μ μ μΌλ‘λΆν° κ°κΉμ΄ μ μ μ λ¨Όμ λ°©λ¬Ένκ³ λ©λ¦¬ λ¨μ΄μ Έ μλ μ μ μ λμ€μ λ°©λ¬Ένλ μν λ°©λ²μ λλ€. μ¦, κΉκ² νμνκΈ° μ μ λκ² νμνλ κ²μ λλ€.
λ λ Έλ μ¬μ΄μ μ΅λ¨ κ²½λ‘ λλ μμμ κ²½λ‘λ₯Ό μ°Ύκ³ μΆμ λ μ°μ λλ€.
μ₯μ
- μΆλ°λ Έλμμ λͺ©νλ ΈλκΉμ§μ μ΅λ¨ κ²½λ‘λ₯Ό 보μ₯νλ€.
λ¨μ
- λ Έλμ μκ° λ§μμλ‘ νμ κ°μ§κ° κΈκ²©νκ² μ¦κ°νμ¬ λ³΄λ€ λ§μ κΈ°μ΅ κ³΅κ°μ΄ νμνλ€.
- ν΄κ° μ‘΄μ¬νμ§ μλλ€λ©΄ μ ν κ·Έλνμ κ²½μ° λͺ¨λ κ·Έλνλ₯Ό νμν νμ μ€ν¨νλ€.
β λ¬Έμ μ ν
- μ΅λ¨ κ²½λ‘ μ°ΎκΈ°
β μκ°λ³΅μ‘λ
λ Έλκ° Nμ΄κ³ , κ°μ μ μκ° EμΈ κ·Έλνμ κ²½μ°
DFSμκ³ λ¦¬μ¦κ³Ό λ§μ°¬κ°μ§λ‘ μΈμ νλ ¬λ‘ ννλ κ²½μ° O(N^2) μΈμ 리μ€νΈλ‘ ννλκ²½μ° O(N+E) μ λλ€.
β νμ λ°©λ²
BFSλ DFSκ° μ¬κ· νΈμΆ or Stackμ μ¬μ©νλκ²κ³Ό λ¬λ¦¬, μΈμ ν μ μ μ λ¨Όμ νμ ν΄μΌνκΈ° λλ¬Έμ μ μ μ μΆ(FIFO)μ νΉμ§μ κ°κ³ μλ Queue μλ£κ΅¬μ‘°λ₯Ό μ¬μ©νμ¬ κ΅¬νν©λλ€.
λ¬Έμ λ₯Ό νλ©΄μ BFSλ₯Ό μ¬μ©ν΄ λ³΄κ² μ΅λλ€.
π μ½λ
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Queue;
import java.util.LinkedList;
public class Main{
static int[][] visited;
static int[][] maze;
static int n;
static int m;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader( new InputStreamReader(System.in));
String[] nm = br.readLine().split(" ");
n = Integer.parseInt(nm[0]);
m = Integer.parseInt(nm[1]);
maze = new int[n][m];
visited = new int[n][m];
for( int i = 0; i<n; i++){
String[] arr = br.readLine().split("");
for( int j = 0; j<m; j++){
maze[i][j] = Integer.parseInt(arr[j]);
}
}
bfs(0,0);
System.out.print(visited[n-1][m-1]);
}
static void bfs(int y, int x){
Queue<int[]> queue = new LinkedList<>();
visited[y][x] = 1; // μ²μ λ°©λ¬Έν μμΉμ΄κΈ° λ무μ 1λ‘ μ€μ ν©λλ€.
queue.offer(new int[]{y,x}); // queueμ νμ μμΉλ₯Ό μΆκ°ν©λλ€.
int[] dx = {1,0,-1,0};
int[] dy = {0,-1,0,1};
//queueμ κ°μ΄ μμλ κΉμ§ whileλ¬Έμ μ€νν©λλ€.
//μ¦, 쑰건μ λ§λ κ²½λ‘ λ(νλ ¬μ λ [n,m])μ λλ¬ν λ κΉμ§ μ€νν©λλ€.
while (!queue.isEmpty()){
int[] cur = queue.poll();
int curX = cur[1];
int curY = cur[0];
for( int i = 0; i<4; i++){
int nx = dx[i] + curX;
int ny = dy[i] + curY;
//μμΉμ μ,ν,μ’,μ° λ°©ν₯μΌλ‘ νμμ ν΄μΌν©λλ€.
//νμ§λ§ λ°©λ¬Έμ νκ±°λ, indexλ₯Ό λ²μ΄λ κ°μ queueμ μΆκ°νμ§ μμ΅λλ€.
if( ny >= 0 && nx >= 0 && ny < n && nx < m ){
if( visited[ny][nx] == 0 && maze[ny][nx] == 1){
//νμ¬ μμΉμ κ°μ +1 νμ¬ λ€μ μμΉμ μΆκ°ν¨μΌλ‘μ¨ κ°μ΄ μ¦κ°νκ² ν©λλ€.
visited[ny][nx] = visited[curY][curX] +1;
queue.offer(new int[]{ny,nx}); //μμΉκ° 쑰건μ λ§λ€λ©΄ queueμ μΆκ°νμ¬ λ€μ νμμ νκ² ν©λλ€.
}
}
}
}
}
}
κ·Έλ¦Όμ²λΌ λ―Έλ‘μ κΈΈμ μ§λκ°λλ§λ€ κ°μ΄ 1μ© μ¦κ°νμ¬ λͺ©μ μ§(n,m)κΉμ§μ μ΅μ 거리λ₯Ό ꡬν μ μμ΅λλ€.
μ€κ°μ λμκ°λ κΈΈλ μμ§λ§ queueλ₯Ό ν΅ν΄ μμ°¨μ μΌλ‘ μΈμ ν μμΉλ₯Ό λ¨Όμ νμνκΈ° λλ¬Έμ μ΄μ κ°μ μ°¨λ‘λ‘ λνλ©΄μ λμκ° μ μμ΅λλ€.
π Reference : https://gmlwjd9405.github.io/2018/08/15/algorithm-bfs.html