티스토리 뷰

PS/boj

boj)2178 - 미로 탐색

kingsubin 2020. 9. 3. 18:20
import java.io.*;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

class Node {
    int index;
    int distance;

    public Node(int index, int distance) {
        this.index = index;
        this.distance = distance;
    }

    public int getIndex() {
        return index;
    }

    public int getDistance() {
        return distance;
    }
}

public class Main {

    static int n, m, nx, ny;
    static int[][] graph = new int[101][101];
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};
    static Node node;

    public static int bfs(int x, int y) {
        Queue<Node> q = new LinkedList<>();
        q.offer(new Node(x, y));

        while (!q.isEmpty()) {
            node = q.poll();
            x = node.getIndex();
            y = node.getDistance();

            for (int i = 0; i < 4; i++) {
                nx = x + dx[i];
                ny = y + dy[i];

                if (nx < 1 || nx > n || ny < 1 || ny > m) {
                    continue;
                }

                if (graph[nx][ny] == 0) {
                    continue;
                }

                if (graph[nx][ny] == 1) {
                    graph[nx][ny] = graph[x][y] + 1;
                    q.offer(new Node(nx, ny));
                }
            }
        }

        return graph[n][m];
    }

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

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

        // 그래프 입력
        for (int i = 1; i <= n; i++) {
            String str = br.readLine();
            for (int j = 1; j <= m; j++) {
                graph[i][j] = (str.charAt(j-1) - '0');
            }
        }

        bw.write(bfs(1, 1) + "\n");
        bw.flush();
        bw.close();
    }
}

 

- 혼자 생각이 잘 안났음 ..

- 이전에 봤던 미로찾기 풀이 참조함

- 봤던건데도 다시 풀려니까 안되넴 ...

 

 

1. graph 에서 1로표시된 부분만 이동하면서 목적지까지 이동했을때 이동 카운트를 구해야한다.

2. bfs로 접근 -> Queue 자료구조 사용 

3. 일단 노드가 서로 연결됬다고 보는게 아니라 좌표가 계속 움직여야 하니까 상하좌우를 생각

 

4. Queue 안에 Node 클래스를 넣어서 사용, 왜냐면 x, y 좌표가 필요하다

5. Queue가 빌때까지 while roof

5-1) Queue 에서 Node를 꺼내고 그 Node에 있는 x, y값을 이용해서 상하좌우 4번 움직인다.

5-2) nx, ny를 기준으로 graph를 벗어나면 roof 종료

5-3) graph[nx][ny] 값이 또한 0이면 움직일 수 없으므로 roof 종료

5-4) graph[nx][ny] == 1일때만 움직일 수 있다.

5-5) graph[nx][ny] 값에 현재값 + 1을 해주면 한 칸 이동할때마다 값이 계속 1씩 증가하게 된다.

       -> 배열 자체에 이동거리를 넣는거라고 생각

5-6) Queue에 Node(nx, ny)를 넣는다

6. 정답 출력 graph[n][m]; 

 

 


www.acmicpc.net/problem/2178

'PS > boj' 카테고리의 다른 글

boj)2644 - 촌수계산  (0) 2020.09.05
boj)7576 - 토마토  (0) 2020.09.05
boj)1012 - 유기농 배추  (0) 2020.09.03
boj)2667 - 단지번호붙이기  (0) 2020.09.03
boj)2606 - 바이러스  (0) 2020.09.03