Algorithm/백준 문제풀이

[백준] 1261 알고스팟 - Java

너지살 2023. 10. 21. 14:31

 

 

 

문제 출저

https://www.acmicpc.net/problem/1261

 

1261번: 알고스팟

첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는 숫자 0과 1이 주어진다. 0은 빈 방을 의미하고, 1은 벽을 의미

www.acmicpc.net

 

 

 

문제 풀이 

세로 n, 가로 m인 2차원 배열이 주어지고 (1,1)에서 (n,m)으로 가야 합니다. 2차원 배열에는 벽이 1로 주어집니다. 이 때 최(n,m)으로 가기 위해 부숴야하는 최소한의 벽의 갯수를 구하는게 이 문제의 요구 사항 입니다. 

 

DP와 BFS로 풀었습니다. 

BFS로 Queue를 만들어 (1,1)을 시작점으로 하여 4방향 탐색을 시작했습니다. 

2차원 dp 배열을 만들어 (y,x) 지점에 도착할 때 필요한 부순 벽의 최솟값을 계속 업데이트 했습니다. 

현재 탐색 중에 부순 벽의 갯수가 dp에 저장된 벽에 갯수 보다 작아야 탐색을 계속 진행할 수 있는 겁니다. 

이런 식으로 dp 배열을 채워 dp (n,m)에 정답을 저장하게 하여 문제를 해결했습니다.

 

 

 

소스 코드 

package baekjoon.backjoon10.day2131.day21;


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;

/*
알고스팟
https://www.acmicpc.net/problem/1261
 */
public class B1261 {

    static int n,m;
    static int[][] board;
    static int[][] dp;
    static int[] dx = {1,0,-1,0};
    static int[] dy = {0,-1,0,1};


    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        m = Integer.parseInt(st.nextToken());
        n = Integer.parseInt(st.nextToken());
        board = new int[n][m];
        for(int i = 0; i < n; i++) {
            String str = br.readLine();
            for(int j = 0; j < m; j++) {
                int number = Character.getNumericValue(str.charAt(j));
                board[i][j] = number;
            }
        }

        dp = new int[n][m];
        int large = n*m+1;
        for(int i = 0; i < n; i++) {
            Arrays.fill(dp[i], large);
        }

        Queue<dot> que = new LinkedList<>();
        dp[0][0] = 0;
        que.add(new dot(0, 0, 0));

        while (!que.isEmpty()) {
            dot d = que.poll();

            for(int i = 0; i < 4; i++) {
                int ny = d.y + dy[i];
                int nx = d.x + dx[i];

                if(check(ny, nx)) {
                    int newCount = d.count;
                    if(board[ny][nx] == 1) {
                        newCount += 1;
                    }

                    if(dp[ny][nx] > newCount) {
                        dp[ny][nx] = newCount;
                        que.add(new dot(ny, nx, newCount));
                    }
                }
            }
        }

        System.out.println(dp[n-1][m-1]);

    }

    public static boolean check(int y, int x) {
        if(y >= 0 && y < n && x >= 0 && x < m) {
            return true;
        }
        else {
            return false;
        }
    }

    public static class dot {
        int y;
        int x;
        int count;

        dot(int y, int x, int count) {
            this.y = y;
            this.x = x;
            this.count = count;
        }
    }
}