반응형

(1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하기

 

필요한 변수

n : 행사이즈
m : 열사이즈
xmove : x좌표 상하좌우 이동값
ymove : y좌표 상하좌우 이동값
queue : bfs 탐색시 필요한 탐색예정 좌표 담을 큐
isChecked : 방문여부
cnt : 1,1로부터 해당칸의 거리

 

로직

1. 지도를 2차원 배열에 저장
2. 현재좌표 0,0 부터 큐에 담기
3. 현재좌표를 기준으로 상하좌우가 이동조건에 맞는지 탐색
 - 이동조건 : 값이 1 && check가 false && 배열범위 내
4. 조건에 부합하는 경우 큐에 넣기, check를 false로 기록, 거리(cnt) 기록

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static int n,m;
    public static int[][] map;
    public static int[] xmove = {-1,1,0,0}; //상 하 좌 우
    public static int[] ymove = {0,0,-1,1};
    public static Deque<int[]> queue = new ArrayDeque<>();
    public static boolean[][] isChecked;
    public static int[][] cnt;
    
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] nm = br.readLine().split(" ");
        n = Integer.parseInt(nm[0]); //행 개수
        m = Integer.parseInt(nm[1]); //열 개수
        map= new int[n][m]; //지도
        isChecked = new boolean[n][m]; //방문 여부
        cnt = new int[n][m];

        //지도 저장
        for(int i=0; i<n; i++){
            String row = br.readLine();
            for(int j=0; j<m; j++){
                map[i][j] = row.charAt(j) - '0';
            }
        }
        bfs();
        System.out.println(cnt[n-1][m-1]);

    }

    public static void bfs(){
        cnt[0][0] = 1;
        queue.offer(new int[]{0,0});

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

            //2. 상화좌우의 이동 가능 좌표 탐색
            for(int i=0; i<4 ;i++){
                int newx = x + xmove[i];
                int newy = y + ymove[i];

                //값이 1이어야 하며, check 안된 곳, 범위를 벗어나지 않아야 함.
                if(newx >= 0 && newy >= 0 && newx < n && newy < m
                && map[newx][newy] == 1
                && !isChecked[newx][newy]){
                    queue.offer(new int[]{newx,newy}); //3. 큐에 넣기
                    isChecked[newx][newy] = true; //방문여부 체크
                    cnt[newx][newy] = cnt[x][y] + 1; //다음 위치 cnt 기록
                }
            }

        }
    }

}
반응형

'코딩 관련 > 코딩문제풀기' 카테고리의 다른 글

[백준] 단지번호붙이기 java  (0) 2024.11.14
[백준] 바이러스 java  (0) 2024.11.12
[백준] 보석 도둑 java  (0) 2024.10.30
[백준] ATM  (0) 2024.10.29
[백준] 설탕 배달  (0) 2024.10.29

+ Recent posts