알고리즘 문제/DFS&BFS

이것이 코딩 테스트이다- 미로 탈출(dfs/bfs)

가끔개발 2023. 5. 17. 14:56

문제 설명

동빈이는 N X M 크기의 직사각형 형태의 미로에 갇혀 있다. 미로에는 여러 마리의 괴물이 있어 이를 피해 탈출해야 한다. 동빈이의 위치는 (1, 1) 이고 미로의 출구는 (N, M)의 위치에 존재하며 한 번에 한 칸씩 이동할 수 있다. 이때 괴물이 있는 부분은 0으로, 괴물이 없는 부분은 1로 표시되어 있다. 미로는 반드시 탈출할 수 있는 형태로 제시된다. 이때 동빈이가 탈출하기 위해 움직여야 하는 최소 칸의 개수를 구하시오. 칸을 셀 때는 시작 칸과 마지막 칸을 모두 포함해서 계산한다.

입력 조건

첫째 줄에 두 정수 N, M (4 <=N, M <= 200)이 주어집니다. 다음 N개의 줄에는 각각 M개의 정수(0 혹은 1)로 미로의 정보가 주어진다. 각각의 수들은 공백 없이 붙어서 입력으로 제시된다. 또한 시작 칸과 마지막 칸은 항상 1이다.

출력 조건

첫째 줄에 최소 이동 칸의 개수를 출력한다.

 

입력 예시

5 6

101010

111111

000001

111111

111111

출력 예시

10

문제풀이

import java.util.*;
class Node{
	private int x;
	private int y;
	public Node(int x, int y) {
		this.x =x;
		this.y =y;
		
	}
	public int getX() {
		return this.x;
	}
	public int getY() {
		return this.y;
	}
}
public class maze {
	public static int n,m;
	public static int[][] graph = new int[201][201];
	
	//이동 할 네가지 방향 정의 (상,하, 좌 ,우)
	public static int dx[] = {-1,1,0,0};
	public static int dy[] = {0,0,-1,1};
	
	public static int bfs(int x, int y) {
		//큐 구현을 위해 queue 라이브러리 사용
		Queue<Node> q = new LinkedList<>();
		q.offer(new Node(x,y));
		// 큐가 빌 때까지 반복하기
		while(!q.isEmpty()) {
			Node node = q.poll();
			x = node.getX();
			y = node.getY();
			// 현재 위치에서 4가지 방향으로의 위치 확인
			for(int i=0; i <4; i++) {
				int nx = x+ dx[i];
				int ny = y+ dy[i];
				// 미로 찾기 공간을 벗어난 경우 무시 
				if(nx <0 || nx >=n || ny<0 || ny > m) continue;
				// 벽인 경우 무시
				if(graph[nx][ny] ==0) continue;
				//해당 노드를 처음 방문하는 경우에만 최단 거리 기록
				if(graph[nx][ny]==1) {
					graph[nx][ny] = graph[x][y]+1;
					q.offer(new Node(nx, ny));
				}
			}
		}
		// 가장 오른쪽 아래 까지 최단거리 변환
		return graph[n-1][m-1];
		
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		
		// N, M 을 공백을 기준으로 구분하여 입력받기
		n = sc.nextInt();
		m = sc.nextInt();
		sc.nextLine();
		
		// 2차원 리스트 맵 정보 받기
		for(int i =0; i<n; i++) {
			String str = sc.nextLine();
			for(int j=0; j<m; j++) {
				graph[i][j] = str.charAt(j)-'0';
			}
		}
		// BFS를 수행 한 결과 출력
		System.out.println(bfs(0,0));
	}

}