ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Q. 14940 자바 : 쉬운 최단거리
    코딩테스트/백준_Java 2023. 4. 22. 23:20

    Q. 14940 자바 : 쉬운 최단거리

     

    문제 : boj.kr/14940

    실버 1 난이도의 문제이다.

     

    그래프가 주어지고, 시작 정점이 주어질 때 모든 정점의 최단거리를 출력하는 문제이다

    주의해야 할 점은 원래 갈 수 있는 땅인 부분 중에서 도달할 수 없는 위치는 -1을 출력한다는 점 이다

     

    아래와 같은 방법으로 풀었다.

    1. 입력은 bool 타입의 2차원 배열로 받았으며, 방문 가느한 위치를 true로 표시했다.

    (이 때 시작 정점의 위치는 따로 저장해 주었다.)

    2. 이후 BFS 순회를 통해 모든 정점을 탐색하며 결과값은 ResArr이라는 2차원 int형 배열에 저장했다.

    (벽이 아닌 경우 - !Graph[y][x], 방문한 경우 visit[y][x] 에는 방문하지 않았다)

    3. 탐색이 끝난 뒤 출력을 위해 ResArr을 방문하면서, 만약 갈 수 있는 땅인데 값이 0인경우 -1로 바꿔서 출력했다.

     

    시간 복잡도는 아래와 같다.

    1. 모든 정점에 대한 BFS 순회 - O(nm)

    2. 출력을 위한 모든 정점 탐색 - O(nm)

    따라서 약 O(nm)으로 시간복잡도가 나오고, n과 m의 최대값은 1000이므로 시간복잡도는 걱정하지 않아도 된다.

     

    풀이는 아래와 같다.

    import java.io.*;
    import java.util.*;
    
    public class Main {
        static FastReader scan = new FastReader();
        static StringBuilder sb = new StringBuilder();
    
        static int m, n;
        static boolean[][] Graph;
        static boolean[][] Visit;
        static int[][] ResArr;
        static int[] dy = new int[] {0, 1, 0, -1};
        static int[] dx = new int[] {1, 0, -1, 0};
        static int[] start;
    
        static void input(){
    
            m = scan.nextInt();
            n =  scan.nextInt();
    
            Visit = new boolean[m][n];
            Graph = new boolean[m][n];
            ResArr = new int[m][n];
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    int input = scan.nextInt();
                    if (input != 0) {
                        Graph[i][j] = true;
                        if (input == 2) {
                            start = new int[] {i, j, 0};
                        }
                    }
                }
            }
        }
    
        static void pro() {
            
            bfs();
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    if (ResArr[i][j] != 0) sb.append(ResArr[i][j]).append(' ');
                    else {
                        if (i == start[0] && j == start[1]) {
                            sb.append(0).append(' ');
                            continue;
                        }
                        if (!Graph[i][j]) sb.append(0).append(' ');
                        else sb.append(-1).append(' ');
                    }
                }
                sb.append('\n');
            }
            System.out.println(sb);
        }
    
        static void bfs() {
    
            Queue<int[]> que = new LinkedList<>();
            que.add(start);
            Visit[start[0]][start[1]] = true;
            
            while (!que.isEmpty()) {
                int[] cur = que.poll(); // y, x, move
                ResArr[cur[0]][cur[1]] = cur[2];
    
                for (int i = 0; i < 4; i++) {
                    int ny = cur[0] + dy[i];
                    int nx = cur[1] + dx[i];
                    if (ny == -1 || nx == -1 || ny == m || nx == n) continue;
                    if (!Graph[ny][nx]) continue;
                    if (Visit[ny][nx]) continue;
                    Visit[ny][nx] = true;
                    que.add(new int[] {ny, nx, cur[2] + 1});
                }
            }
        }
    
        public static void main(String[] args) throws IOException {
            input();
            pro();
        }
    
    
        static class FastReader {
            BufferedReader br;
            StringTokenizer st;
    
            public FastReader() {
                br = new BufferedReader(new InputStreamReader(System.in));
            }
    
            public FastReader(String s) throws FileNotFoundException {
                br = new BufferedReader(new FileReader(new File(s)));
            }
    
            String next() {
                while (st == null || !st.hasMoreElements()) {
                    try {
                        st = new StringTokenizer(br.readLine());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                return st.nextToken();
            }
    
            int nextInt() {
                return Integer.parseInt(next());
            }
    
            long nextLong() {
                return Long.parseLong(next());
            }
    
            double nextDouble() {
                return Double.parseDouble(next());
            }
    
            String nextLine() {
                String str = "";
                try {
                    str = br.readLine();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return str;
            }
        }
    }import java.io.*;
    import java.util.*;
    
    public class Main {
        static FastReader scan = new FastReader();
        static StringBuilder sb = new StringBuilder();
    
        static int m, n;
        static boolean[][] Graph;
        static boolean[][] Visit;
        static int[][] ResArr;
        static int[] dy = new int[] {0, 1, 0, -1};
        static int[] dx = new int[] {1, 0, -1, 0};
        static int[] start;
    
        static void input(){
    
            m = scan.nextInt();
            n =  scan.nextInt();
    
            Visit = new boolean[m][n];
            Graph = new boolean[m][n];
            ResArr = new int[m][n];
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    int input = scan.nextInt();
                    if (input != 0) {
                        Graph[i][j] = true;
                        if (input == 2) {
                            start = new int[] {i, j, 0};
                        }
                    }
                }
            }
        }
    
        static void pro() {
            
            bfs();
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    if (ResArr[i][j] != 0) sb.append(ResArr[i][j]).append(' ');
                    else {
                        if (i == start[0] && j == start[1]) {
                            sb.append(0).append(' ');
                            continue;
                        }
                        if (!Graph[i][j]) sb.append(0).append(' ');
                        else sb.append(-1).append(' ');
                    }
                }
                sb.append('\n');
            }
            System.out.println(sb);
        }
    
        static void bfs() {
    
            Queue<int[]> que = new LinkedList<>();
            que.add(start);
            Visit[start[0]][start[1]] = true;
            
            while (!que.isEmpty()) {
                int[] cur = que.poll();
                ResArr[cur[0]][cur[1]] = cur[2];
    
                for (int i = 0; i < 4; i++) {
                    int ny = cur[0] + dy[i];
                    int nx = cur[1] + dx[i];
                    if (ny == -1 || nx == -1 || ny == m || nx == n) continue;
                    if (!Graph[ny][nx]) continue;
                    if (Visit[ny][nx]) continue;
                    Visit[ny][nx] = true;
                    que.add(new int[] {ny, nx, cur[2] + 1});
                }
            }
        }
    
        public static void main(String[] args) throws IOException {
            input();
            pro();
        }
    
    
        static class FastReader {
            BufferedReader br;
            StringTokenizer st;
    
            public FastReader() {
                br = new BufferedReader(new InputStreamReader(System.in));
            }
    
            public FastReader(String s) throws FileNotFoundException {
                br = new BufferedReader(new FileReader(new File(s)));
            }
    
            String next() {
                while (st == null || !st.hasMoreElements()) {
                    try {
                        st = new StringTokenizer(br.readLine());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                return st.nextToken();
            }
    
            int nextInt() {
                return Integer.parseInt(next());
            }
    
            long nextLong() {
                return Long.parseLong(next());
            }
    
            double nextDouble() {
                return Double.parseDouble(next());
            }
    
            String nextLine() {
                String str = "";
                try {
                    str = br.readLine();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return str;
            }
        }
    }
    반응형

    '코딩테스트 > 백준_Java' 카테고리의 다른 글

    Q. 15657 자바 : N과 M(8)  (2) 2023.04.25
    Q. 15654 자바 : N과M(5)  (0) 2023.04.24
    Q. 4179 자바 : 불!  (0) 2023.04.21
    Q. 2660 자바 : 회장 뽑기  (0) 2023.04.20
    Q. 12427 자바 : 회사 문화 1  (0) 2023.04.19

    댓글

Designed by Tistory.