https://www.codetree.ai/missions/2/problems/escape-maze-with-wall-following/description
그. 대. 로 구현하면 된다
오른쪽에 벽이 있는지 확인 하기 위해서
시계 방향으로 방향을 한 칸 증가 했을 때 상태를 확인함
케이스별로 나눠서 if문을 작성하기
시간이 증가하는 조건 잘 확인하기
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
static int N; // 격자의 크기
static int X, Y; // 시작 위치
static char WALL = '#', EMPTY = '.';
static char[][] box;
static int[][] way = {{0,1}, {-1,0}, {0,-1}, {1,0}}; // 반시계방향
public static void main(String[] args) throws Exception{
System.setIn(new FileInputStream("src/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine()); // 격자의 크기
StringTokenizer st = new StringTokenizer(br.readLine());
X = Integer.parseInt(st.nextToken()) - 1; // 시작 위치
Y = Integer.parseInt(st.nextToken()) - 1;
box = new char[N][N];
for(int i = 0; i < N; i++) {
String line = br.readLine();
for(int j = 0; j < N; j++) {
box[i][j] = line.charAt(j);
}
}
boolean[][][] visited = new boolean[N][N][4];
int w = 0;
int time = 0;
while(true) {
if(!inRange(X, Y))break; // 종료조건
if(visited[X][Y][w]) { // 답이 없는 조건
System.out.println(-1);
return;
}
visited[X][Y][w] = true;
int nx = X + way[w][0];
int ny = Y + way[w][1];
if(inRange(nx,ny) && box[nx][ny] == WALL) { // 이동 불가능 => 방향 회전
w = (w + 1) % 4;
} else if(!inRange(nx,ny)) { // 이동 가능 + 격자밖 => 탈출
X = nx;
Y = ny;
time += 1;
} else { // 이동 가능 + 격자내 => 조건 2가지로 또 나뉨
int rightW = (w + 3) % 4;
int rightX = nx + way[rightW][0];
int rightY = ny + way[rightW][1];
if(inRange(rightX, rightY) && box[rightX][rightY] == WALL) { // 오른쪽에 벽이 있는 경우
X = nx;
Y = ny;
time += 1;
} else { // 현재 방향으로 한 칸 이동후, 시계 방향으로 90도 틀어 한칸 더 전진
X = rightX;
Y = rightY;
w = rightW;
time += 2; // 두번 이동했으므로 시간+= 2
}
}
}
System.out.println(time);
}
static boolean inRange(int nx , int ny) {
return nx >= 0 && nx < N && ny >= 0 && ny <N;
}
}
[코드트리] 회의실 준비 (0) | 2024.10.24 |
---|---|
[프로그래머스] 탐욕법 : 구명보트 (0) | 2024.10.23 |
[코드트리] 다수의 객체 이동 (0) | 2024.10.10 |
[코드트리] 오목 (0) | 2024.10.09 |
[코드트리] 순위경쟁2 (0) | 2024.10.07 |