[백준] 2178번 - 미로 탐색(BFS)

2025. 2. 23. 15:37·PS

최단거리를 구하는 문제 ... -> BFS 사용!

 

 

BFS 처리하는 과정

1. 시작 노드 A를 방문한다.

- 시작 정점을 방문하여 방문 표시 한 후 해당 노드를 enqueue 한다.

 

2. 큐에서 첫번째 정점을 제거하고 제거된 정점과 인접한 정점에 대하여 방문하지 않은 정점을 방문한다.

- 큐에서 꺼낸 노드를 방문한다.

- 이 노드와 인접하는 노드들을 모두 방문한다.

- 인접한 노드가 없으면 큐의 맨 앞에서 노드를 꺼낸다.

 

3. 큐가 소진될 때까지 위 과정을 반복한다.

 

 

 

앞서 DFS로 풀었던 2667번과 비슷하게 풀 수 있는 유형이라 어렵지 않게 풀 수 있었던 것 같다!

 

package 백준.dfs_bfs;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;

public class baekjoon_2178 {

    static int[][] arr, distance;
    static boolean[][] isVisited;
    static Queue<int[]> queue = new LinkedList<>();
    static int[] dirX = {0, 0, -1, 1};
    static int[] dirY = {-1, 1, 0, 0};
    static int N, M, nowX, nowY;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] str = br.readLine().split(" ");
        N = Integer.parseInt(str[0]);
        M = Integer.parseInt(str[1]);
        arr = new int[N][M];

        for (int i = 0; i < N; i++) {
            String[] st = br.readLine().split("");
            for (int j = 0; j < M; j++) {
                arr[i][j] = Integer.parseInt(st[j]);
            }
        }
        System.out.println(BFS(0, 0));
    }

    public static int BFS(int x, int y) {
        isVisited = new boolean[N][M];
        queue.add(new int[]{x, y});
        isVisited[x][y] = true;
        distance = new int[N][M];
        distance[x][y] = 1;

        while (!queue.isEmpty()) {
            int curX = queue.peek()[0];
            int curY = queue.peek()[1];
            queue.poll();
            for (int i = 0; i < 4; i++) {
                nowX = dirX[i] + curX;
                nowY = dirY[i] + curY;
                if (nowX >= 0 && nowX < N && nowY >= 0 && nowY < M) {
                    if (arr[nowX][nowY] == 1 && !isVisited[nowX][nowY]) {
                        isVisited[nowX][nowY] = true;
                        queue.add(new int[]{nowX, nowY});
                        distance[nowX][nowY] = distance[curX][curY] + 1;
                    }
                }
            }
        }
        return distance[N - 1][M - 1];
    }
}

 

이동 거리를 저장하는 distance 배열을 추가하여, BFS가 최단 거리를 리턴할 수 있도록 하였다.

 

 

'PS' 카테고리의 다른 글

[백준] 2667번 - 단지 번호 붙이기 (DFS)  (2) 2025.02.20
[백준] 1931번 - 회의실 배정  (0) 2025.02.16
[백준] 1542번 - 잃어버린 괄호  (0) 2025.02.15
[백준] 11047번 동전 0  (0) 2025.01.30
[백준] 2504번 - 괄호의 값  (1) 2025.01.21
'PS' 카테고리의 다른 글
  • [백준] 2667번 - 단지 번호 붙이기 (DFS)
  • [백준] 1931번 - 회의실 배정
  • [백준] 1542번 - 잃어버린 괄호
  • [백준] 11047번 동전 0
zioni
zioni
  • zioni
    jiwon's dev.log
    zioni
  • 전체
    오늘
    어제
    • 분류 전체보기 (76)
      • spring & java (13)
      • Algorithm (14)
      • PS (37)
      • project (3)
      • experience (1)
      • etc (6)
      • study (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    백준2525
    자바
    백준
    java
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
zioni
[백준] 2178번 - 미로 탐색(BFS)
상단으로

티스토리툴바