알고리즘/코드트리 문제풀이

코드트리 [자바 java] 네 방향 탈출 가능 여부 판별하기

잔디🌿 2023. 8. 1. 23:01

https://www.codetree.ai/missions/2/problems/determine-escapableness-with-4-ways?utm_source=clipboard&utm_medium=text

 

 

https://ethereal-coder.tistory.com/86

 

코드트리 [자바 java] 두 방향 탈출 가능 여부 판별하기

https://www.codetree.ai/missions/2/problems/determine-escapableness-with-2-ways?utm_source=clipboard&utm_medium=text 코드트리 | 코딩테스트 준비를 위한 알고리즘 정석 국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보

ethereal-coder.tistory.com

 

두방향 탈출여부 판별과 거의 유사한 문제이다.

마찬가지로 0,0부터 탐색하기 시작해서 상하좌우에 뱀이 없는 칸을 queue에 넣어 다시 그 칸에 대한 상하좌우를 탐색하도록 하였다. 이때 특정 칸에 대해서 끝 도달 가능 여부는 정해져 있기 때문에 이미 탐색한 칸을 또 탐색하면 효율만 떨어져서 vis 배열을 이용해서 방문여부를 표시했다.

달라진 점은 방향이 상우에서 상하좌우로 바뀌었다는 것과, bfs로 풀어야한다는 점이다.

나는 dx,dy 배열에 -1요소를 추가하고, stack를 queue로 바꾸었다. 

 

import java.io.*;
import java.util.*;


public class Main {

    static class xy{
        int x;
        int y;
        xy(int x, int y){
            this.x = x;
            this.y = y;
        }
    }

    public static void main(String[] args) throws IOException{
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       StringTokenizer st = new StringTokenizer(br.readLine());

       int n = Integer.parseInt(st.nextToken());
       int m = Integer.parseInt(st.nextToken());

       int[][] arr = new int[n][m];

       for(int i =0;i<n;i++){
        st = new StringTokenizer(br.readLine());
        for(int j =0 ;j<m;j++){
            arr[i][j] = Integer.parseInt(st.nextToken());
        }
       }

       Queue<xy> q = new LinkedList<>();

       q.offer(new xy(0,0));

       int[] dx = {1,0,-1,0};
       int[] dy = {0,1,0,-1};

       boolean[][] vis = new boolean[n][m];

       while(q.isEmpty() != true){
        xy now = q.poll();

        if(now.x == n-1 && now.y == m-1){
            System.out.println(1);
            System.exit(0);
        }

        if(vis[now.x][now.y] == false){
            vis[now.x][now.y] = true;
            for(int i = 0;i<4;i++){
            if( now.x + dx[i] < n && now.x + dx[i] >=0 && now.y + dy[i] < m && now.y + dy[i] >=0 &&arr[now.x + dx[i]][now.y + dy[i]] == 1){
                q.offer(new xy(now.x + dx[i], now.y + dy[i]));
            }
        }

        }

       }

       System.out.println(0);
    }
}