BOJ 14940 쉬운 최단거리

이형욱·2025년 5월 19일
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.StringTokenizer;

/***
 * 시간제한: 1초, 메모리 제한 128MB
 * 2<=N<=1000, 2<=M<=1000
 */
public class Main {
    // 동, 서, 남, 북
    static int[] dy = {0, 0, 1, -1};
    static int[] dx = {1, -1, 0, 0};
    static int N, M;
    static int[][] map, res;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

        map = new int[N][M];

        int startY = 0;
        int startX = 0;
        for(int i=0; i<N; i++){
            st = new StringTokenizer(br.readLine());
            for(int j=0; j<M; j++){
                map[i][j] = Integer.parseInt(st.nextToken());
                if(map[i][j]==2){
                    startY = i;
                    startX = j;
                }
            }
        }

        res = new int[N][M];
        bfs(startY, startX);

        StringBuilder sb = new StringBuilder();

        for(int i=0; i<N; i++){
            for(int j=0; j<M; j++){
                sb.append(res[i][j]).append(" ");
            }
            sb.append("\n");
        }
        System.out.println(sb);
    }

    static void bfs(int startY, int startX){
        res[startY][startX] = 0;

        Deque<int[]> queue = new ArrayDeque<>();

        queue.offer(new int[] {startY, startX});

        while(!queue.isEmpty()){
            int[] curr = queue.poll();
            int y = curr[0];
            int x = curr[1];

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

                if(ny < 0 || ny >= N || nx < 0 || nx >= M) continue;

                if(map[ny][nx] == 1 && res[ny][nx]==0){
                    res[ny][nx] = res[y][x]+1;
                    queue.offer(new int[] {ny, nx});
                }
            }
        }

        for(int i=0; i<N; i++){
            for(int j=0; j<M; j++){
                if(map[i][j]==1 && res[i][j]==0) res[i][j] = -1;
            }
        }
    }
}
profile
바나나는 하드디스크보다 따듯하다.

0개의 댓글