[백준] 16954 움직이는 미로 탈출 JAVA 풀이

권용환·2021년 8월 29일
0

백준

목록 보기
1/36
post-thumbnail

문제 바로가기

나의 풀이

같은 depth에 해당하는 만큼 queue에서 빼내주는 방식을 생각해냈어야 한다.
또한, 시작점이 왼쪽 하단이고 목표 지점이 오른쪽 상단인데 인덱스를 헷갈리지 않고 잘 쓰도록 하자.

int nx = pos.x + dx[j];
int ny = pos.y + dy[j];

이부분에서 dx[j]가 아니라 dx[i]로 써버렸는데, i와 j가 크게 구분이 안되어서 애먹었다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;

//좌표 x,y 선언
class Pos {

    public int x;
    public int y;

    public Pos(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

public class Main {

    // '.' 와 '#'가 그려질 map을 static으로 선언
    static char[][] map = new char[8][8];
    // bfs 사용위한 큐 선언
    static Queue<Pos> q = new LinkedList<>();
    // 대각선 포함한 8방향 + 제자리
    static int dx[] = {1, -1, 0, 0, 1, -1, -1, 1, 0};
    static int dy[] = {0, 0, 1, -1, 1, -1, 1, -1, 0};

    public static void main(String[] args) throws IOException {

        // char형태 그대로 map에 저장
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        for (int i = 0; i < 8; i++) {
            char[] c = br.readLine().toCharArray();
            for (int j = 0; j < 8; j++) {
                map[i][j] = c[j];
            }
        }

        // 배열처럼 왼쪽 상단을 (0,0)으로 생각하고 시작점인 왼쪽 하단을 (7,0)으로 두기
        Pos start = new Pos(7, 0);
        q.offer(start);
        bfs();
    }

    public static void bfs() {
        while (!q.isEmpty()) {
            // 같은 depth에 해당하는 만큼 큐에서 빼내줘야 down() 함수 호출 가능
            int s = q.size();
            for (int i = 0; i < s; i++) {
                Pos pos = q.poll();
                if (map[pos.x][pos.y] == '#') {
                    continue;
                }
                for (int j = 0; j < 9; j++) {
                    int nx = pos.x + dx[j];
                    int ny = pos.y + dy[j];
                    if (nx < 0 || ny < 0 || nx >= 8 || ny >= 8) {
                        continue;
                    }
                    if (nx == 0 && ny == 7) {
                        System.out.println(1);
                        return;
                    }
                    if (map[nx][ny] != '#') {
                        q.offer(new Pos(nx, ny));
                    }
                }
            }
            down();
        }
        System.out.println(0);
    }

    public static void down() {
        for (int i = 6; i >= 0; i--) {
            for (int j = 0; j < 8; j++) {
                map[i + 1][j] = map[i][j];
            }
        }
        for (int i = 0; i < 8; i++) {
            map[0][i] = '.';
        }
    }
}
profile
마구 낙서하는 블로그입니다

0개의 댓글