[백준][2178번] 미로탐/

Updated:

문제 URL

https://www.acmicpc.net/problem/2178 boj2667

dfs

(1,1)에서 (n,m)으로 가는 가장 빠른 길을 구하는 문제이다.

  • DFS 탐색으로는 문제를 풀 수 없다. BFS탐색을 이용해야한다.
  • BFS의 단계별로 진행된다는 사실을 이용하면된다.
  • BFS는 모든 정점을 ‘단 한번만’ 방문한다. 또 다시 방문을 허용하면 시간복잡도는 증가하며 BFS가 아닌 브루트포스라고 부른다.
public static void bfs(int[][] map, int[][] check, int startX, int startY, int n, int m) {
        int[] dx = new int[]{1, -1, 0, 0};
        int[] dy = new int[]{0, 0, 1, -1};
        Queue<Pair> q = new LinkedList<>();
        q.add(new Pair(startX, startY,1));

        while (!q.isEmpty()) {
            Pair p = q.remove();
            int x = p.x;
            int y = p.y;
            int cnt = p.cnt;

            for (int i = 0; i < 4; i++) {
                int cx = x + dx[i];
                int cy = y + dy[i];
                if (0 <= cx && cx < n && 0 <= cy && cy < m) {
                    if (map[cx][cy] == 1 && check[cx][cy] == 0) {
                        q.add(new Pair(cx, cy,cnt+1));
                        check[cx][cy] = cnt+1;
                    }
                }
            }
        }
    }

전체 풀이

package backjoon;

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


public class Main {
    static public class Pair {
        public int x;
        public int y;
        public int cnt;

        public Pair(int x, int y, int cnt) {
            this.x = x;
            this.y = y;
            this.cnt = cnt;
        }
    }
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String args[]) throws IOException {
            String[] str = br.readLine().split(" ");
            int n = Integer.parseInt(str[0]);
            int m = Integer.parseInt(str[1]);
            int[][] map = new int[n][m];
            int[][] check = new int[n][m];

            for (int i = 0; i < n; i++) {
                String st = br.readLine();
                for (int j = 0; j < m; j++) {
                    map[i][j] = st.charAt(j)-'0';
                }
            }

            bfs(map,check,0, 0, n, m);
            System.out.println(check[n-1][m-1]);
        }

    public static void bfs(int[][] map, int[][] check, int startX, int startY, int n, int m) {
        int[] dx = new int[]{1, -1, 0, 0};
        int[] dy = new int[]{0, 0, 1, -1};
        Queue<Pair> q = new LinkedList<>();
        q.add(new Pair(startX, startY,1));

        while (!q.isEmpty()) {
            Pair p = q.remove();
            int x = p.x;
            int y = p.y;
            int cnt = p.cnt;

            for (int i = 0; i < 4; i++) {
                int cx = x + dx[i];
                int cy = y + dy[i];
                if (0 <= cx && cx < n && 0 <= cy && cy < m) {
                    if (map[cx][cy] == 1 && check[cx][cy] == 0) {
                        q.add(new Pair(cx, cy,cnt+1));
                        check[cx][cy] = cnt+1;
                    }
                }
            }
        }
    }
}

다른풀이

import java.util.*;

class Pair {
    int x;
    int y;
    Pair(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

public class Main {
    public static final int[] dx = {0, 0, 1, -1};
    public static final int[] dy = {1, -1, 0, 0};
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[][] a = new int[n][m];
        sc.nextLine();
        for (int i=0; i<n; i++) {
            String s = sc.nextLine();
            for (int j=0; j<m; j++) {
                a[i][j] = s.charAt(j) - '0';
            }
        }
        int[][] dist = new int[n][m];
        boolean[][] check = new boolean[n][m];
        Queue<Pair> q = new LinkedList<Pair>();
        q.add(new Pair(0, 0));
        check[0][0] = true;
        dist[0][0] = 1;
        while (!q.isEmpty()) {
            Pair p = q.remove();
            int x = p.x;
            int y = p.y;
            for (int k=0; k<4; k++) {
                int nx = x+dx[k];
                int ny = y+dy[k];
                if (0 <= nx && nx < n && 0 <= ny && ny < m) {
                    if (check[nx][ny] == false && a[nx][ny] == 1) {
                        q.add(new Pair(nx, ny));
                        dist[nx][ny] = dist[x][y] + 1;
                        check[nx][ny] = true;
                    }
                }
            }
        }
        System.out.println(dist[n-1][m-1]);
    }
}

Leave a comment