상세 컨텐츠

본문 제목

[코드트리] 벽 짚고 미로 탈출하기

💯ProblemSolving/문제 풀이

by :Eundms 2024. 10. 11. 09:11

본문

       문제 요약        

- 문제

 

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;
    }


}
728x90

'💯ProblemSolving > 문제 풀이' 카테고리의 다른 글

[코드트리] 다수의 객체 이동  (5) 2024.10.10
[코드트리] 오목  (0) 2024.10.09
[코드트리] 순위경쟁2  (0) 2024.10.07
[BJ] 1182 : 부분수열의 합  (0) 2024.10.05
[SWEA] 4408. 자기 방으로 돌아가기  (0) 2024.10.01

관련글 더보기

댓글 영역