반응형
(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 |