1. 문제 설명
- 설명
7*7 격자판 미로를 탈출하는 최단경로의 길이를 출력하는 프로그램을 작성하세요.
경로의 길이는 출발점에서 도착점까지 가는데 이동한 횟수를 의미한다.
출발점은 격자의 (1, 1) 좌표이고, 탈출 도착점은 (7, 7) 좌표이다. 격자판의 1은 벽이고, 0은 도로이다.
격자판의 움직임은 상하좌우로만 움직인다. 미로가 다음과 같다면
위와 같은 경로가 최단 경로의 길이는 12이다. - 입력
첫 번째 줄부터 7*7 격자의 정보가 주어집니다. - 출력
첫 번째 줄에 최단으로 움직인 칸의 수를 출력한다. 도착할 수 없으면 -1를 출력한다.
2. 문제 코드 및 풀이 설명
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
class Point {
public int x, y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
public class ShortestDistanceInMaze {
// 미로를 찾는 방향을 설정한 배열
static int[] dx = {-1, 0, 1, 0};
static int[] dy = {0, 1, 0, -1};
// 미로와 이동거리가 입력될 배열
static int[][] board, dis;
public static void main(String[] args) {
ShortestDistanceInMaze T = new ShortestDistanceInMaze();
Scanner kb = new Scanner(System.in);
board = new int[8][8];
dis = new int[8][8];
for (int i = 1; i <= 7; i++) {
for (int j = 1; j <= 7; j++) {
board[i][j] = kb.nextInt();
}
}
T.BFS(1, 1); // (1,1)부터 시작
if (dis[7][7] == 0) System.out.println(-1); // 도착할 수 없다면 -1
else System.out.println(dis[7][7]);
}
// 미로 최단거리
// BFS 알고리즘을 이용하여 출발점에서 이동하며 이동한 거리를 저장
// 계속 이동시키며 큐에 남은 객체가 없을때까지 곧 더 이상 이동할 수 없을때까지 반복
// 도착지점에 저장된 이동거리를 출력
public void BFS(int x, int y) {
Queue<Point> Q = new LinkedList<>();
Q.offer(new Point(x, y)); // 현재 지점에 해당하는 객체 넣기
board[x][y] = 1; // 출발점 체크
while (!Q.isEmpty()) {
Point tmp = Q.poll(); // 현재 위치 꺼내기
for (int i = 0; i < 4; i++) { // 네 방향으로 가는 경우 확인
int nx = tmp.x + dx[i];
int ny = tmp.y + dy[i];
// 좌표 이동 후 그 좌표가 좌표계 안에 있고 이동가능한 경로라면
if (nx >= 1 && nx <= 7 && ny >= 1 && ny <= 7 && board[nx][ny] == 0) {
board[nx][ny] = 1; // 이동했다고 체크
Q.offer(new Point(nx, ny)); // 다음 위치의 객체를 넣어주고
dis[nx][ny] = dis[tmp.x][tmp.y] + 1; // +1된 거리를 거리배열에 저장
}
}
}
}
}
3. 출력 예시
입력
0 0 0 0 0 0 0
0 1 1 1 1 1 0
0 0 0 1 0 0 0
1 1 0 1 0 1 1
1 1 0 0 0 0 1
1 1 0 1 1 0 0
1 0 0 0 0 0 0
출력
12
위의 내용은 인프런에서 수강할 수 있는 김태원님의 자바 알고리즘 문제풀이 강의를 바탕으로 공부한 내용을 정리한 내용입니다!