Algorithm

[백준] 2178. 미로 탐색(Java)

거북목을 가진 김기린 2024. 5. 1. 21:30
728x90
반응형

문제

https://www.acmicpc.net/problem/2178

풀이

2차원 배열 내 0,0 지점에서 N-1,M-1까지 도달하는데 걸리는 최단시간을 구하는 문제

입력 값을 바탕으로 2차원 배열을 형성하고

 

1) 큐 사이즈 순회 및 time 카운팅 방법

2) 큐에 다음 위치와 현재까지 걸린 시간을 넘겨주는 방법

 

두 가지 방법 중 하나를 선택해 해결하면 된다.

이러한 방식에 대한 설명은 아래 링크를 참고하면 된다.

 

2차원 배열 내에서 최단시간 탐색 방법 - [백준] 숨바꼭질

 

[백준] 1697. 숨바꼭질(Java)

문제https://www.acmicpc.net/problem/1697풀이bfs 탐색을 진행하면서 K에 도달하기까지 걸리는 최소시간을 구하는 문제2가지 방법이 존재함 1) qSize만큼 순회하면서 time 체크하는 방법현재 큐 사이즈만큼

girinkim.tistory.com

코드

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

class Main {
    static int R, C;
    static int[][] arr;
    static boolean[][] v;
    static int[] dr = {-1, 0, 1, 0};
    static int[] dc = {0, 1, 0, -1};
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuilder sb;

        R = Integer.parseInt(st.nextToken());
        C = Integer.parseInt(st.nextToken());

        arr = new int[R][C];
        v = new boolean[R][C];

        for(int i = 0 ; i < R ; i ++){
            String s = br.readLine();
            for(int j = 0 ; j < C ; j ++)
                arr[i][j] = s.charAt(j) - '0';
        }

        bfs();
    }

    private static void bfs() {
        Queue<int[]> q = new ArrayDeque<>();

        int cnt = 1;

        v[0][0] = true;
        q.offer(new int[]{0, 0});

        while (!q.isEmpty()) {
            int qSize = q.size();

            for (int i = 0 ; i < qSize ; i++) {
                int[] cur = q.poll();

                if (cur[0] == R-1 && cur[1] == C-1) {
                    System.out.println(cnt);
                    return;
                }

                for(int d = 0 ; d < 4 ; d ++){
                    int nr = cur[0] + dr[d];
                    int nc = cur[1] + dc[d];

                    if(!isValid(nr, nc) || v[nr][nc] || arr[nr][nc] == 0) continue;

                    v[nr][nc] = true;
                    q.offer(new int[]{nr, nc});

                }
            }

            cnt++;
        }
    }

    private static boolean isValid(int nr, int nc) {
        return (nr>=0 && nr<R && nc>=0 && nc<C);
    }
}
728x90
반응형