알고리즘/SWEA
[ SWEA / 자바 ] 1226번 미로1
감싹이
2022. 9. 27. 09:53
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14vXUqAGMCFAYD
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
📑 문제
출발점에서 도착점까지 갈 수 있는지 없는지를 판단하는 문제
💡 입력
✔ 맨 첫 줄은 테스트케이스 번호
✔ 1은 벽을 나타내며, 0은 길, 2는 출발점, 3은 도착점
✨ 풀이과정
✔ 도착지까지 갈 수 있는지 없는지이므로 dfs를 이용한다
✔ 도착지를 찾으려면 끝까지 가봐야 알 수 있으므로 bfs보다 dfs가 적합하다고 판단하였다
✔ 상하좌우 델타를 이용하여 갈 수 있는 길을 전부 가보며 도착지까지 벽을 만나지 않고 갈 수 있는지 판단한다
📑 코드
import java.util.Scanner;
public class 미로1 {
static int[][] maze; //미로 배열
static boolean[][] check; //체크 배열
//델타
static int[] di;
static int[] dj;
static boolean ans; //출발지부터 도달할 수 있는지 없는지
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for(int tc=1; tc<=10; tc++) {
int T = sc.nextInt(); //테스트케이스
//나중에 범위를 따로 지정하지 않기 위해 배열 크기를 2 크게 만들어서 벽 생성
maze = new int[18][18];
check = new boolean[18][18];
int startX = 0; //출발 x 좌표
int startY = 0; //출발 y 좌표
for(int i=0; i<18; i++) {
String str; //문자열 입력 받자
if(i>=1 && i<17) {
str = sc.next();
} else str = "1111111111111111"; //상하 벽
for(int j=0; j<18; j++) {
if(j==0 || j==17) { //좌우 벽
maze[i][j] = 1;
check[i][j] =true;
} else {
maze[i][j] = str.charAt(j-1) - '0'; //int 형으로 변환해서 미로에 넣어주기
if(maze[i][j] == 1) {
check[i][j] = true; //1로 입력되면 벽이니까 true로 변경
}
if(maze[i][j] == 2) { //시작점 지정
startX = i;
startY = j;
}
}
}
}
//상하좌우
di = new int[] {-1, 1, 0, 0};
dj = new int[] {0, 0, -1, 1};
ans = false;
dfs(startX, startY);
if(ans) System.out.println("#"+tc+" "+1);
else System.out.println("#"+tc+" "+0);
}
}
private static void dfs(int x, int y) {
if(check[x][y]==true) return; //벽을 만나면 끝
if(maze[x][y]==3) { //도착점을 만나면
ans = true; //정답 true로 바꿔주기
return;
} else {
check[x][y] = true; //방문지점은 체크하고
for(int d=0; d<4; d++) { //상하좌우 돌면서
int ni = x+di[d];
int nj = y+dj[d];
dfs(ni, nj); //가보자!
}
}
}
}