코테/문제풀이

[백준] 2178 미로 탐색 자바 BFS 문제 풀이 및 정답

내가 그린 코딩 그림 2024. 2. 29. 02:27
반응형

문제 요약)

- 세로 n, 가로 m이 주어짐

- 출발위치에서 마지막 위치의 최소거리

 

주의점)

- x

 

풀이)

BFS로 풀이를 진행하며 q를 사용할때 x, y등 좌표값을 줘야하기 때문에 class를 선언해주거나 배열자체를 q에 넣어야하는데 별도 클래스를 만드는 것보다 배열이 조금 더 편해서 배열로 풀이했습니다.

 

java
닫기
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; public class Maze2178_blog { ​​​​static int[] dx = {-1, 0, 1, 0}; ​​​​static int[] dy = {0, 1, 0, -1}; ​​​​static int[][] map; ​​​​static int[][] distance; ​​​​static int n, m; ​​​​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()); ​​​​​​​​// 첫 위치가 1,1이니까 인덱스가 1부터 잡히게 +1해주기 ​​​​​​​​map = new int[n+1][m+1]; ​​​​​​​​distance = new int[n+1][m+1]; ​​​​​​​​// map 채워주기 ​​​​​​​​for (int i=1; i<=n; i++) { ​​​​​​​​​​​​String[] strs = br.readLine().split(""); ​​​​​​​​​​​​int j = 1; ​​​​​​​​​​​​for (String a : strs) { ​​​​​​​​​​​​​​​​map[i][j] = Integer.parseInt(a); ​​​​​​​​​​​​​​​​j++; ​​​​​​​​​​​​} ​​​​​​​​} ​​​​​​​​distance[1][1] = 1; ​​​​​​​​BFS(1, 1); ​​​​​​​​System.out.println(distance[n][m]); ​​​​} ​​​​static void BFS(int x, int y) { ​​​​​​​​Queue<int[]> q = new LinkedList<>(); ​​​​​​​​q.offer(new int[]{x, y}); ​​​​​​​​while(!q.isEmpty()) { ​​​​​​​​​​​​int[] current = q.poll(); ​​​​​​​​​​​​for (int k=0; k<4; k++) { ​​​​​​​​​​​​​​​​int nx = current[0] + dx[k]; ​​​​​​​​​​​​​​​​int ny = current[1] + dy[k]; ​​​​​​​​​​​​​​​​// out of index 방지 ​​​​​​​​​​​​​​​​if (nx < 1 || ny < 1 || nx > n || ny > m) continue; ​​​​​​​​​​​​​​​​// 이미 방문했거나(dis가 0이상이면 방문했다는 것) 방문 불가한 곳 제외 ​​​​​​​​​​​​​​​​if (distance[nx][ny] > 0 || map[nx][ny] == 0) continue; ​​​​​​​​​​​​​​​​// q에 넣고 거리 세팅해주기 ​​​​​​​​​​​​​​​​q.offer(new int[] {nx, ny}); ​​​​​​​​​​​​​​​​distance[nx][ny] = distance[current[0]][current[1]] + 1; ​​​​​​​​​​​​} ​​​​​​​​} ​​​​} }

 

 

반응형