ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Q. 7562 자바 : 나이트의 이동
    코딩테스트/백준_Java 2023. 4. 10. 09:02

    Q. 7562 자바 : 나이트의 이동

     

    문제 : boj.kr/7562

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

     

    나이트의 위치가 주어지고, 잡아야 할 말의 위치가 주어진다.

    이 때 나이트가 몇 번 움직여서 말을 잡을수 있는지 출력하는 문제이다.

     

    격자형 그래프 탐색문제에서 상 하 좌 우 순회하는 방식을 응용해 탐색하는 범위만 바꾸면 쉽게 풀리는 문제이다.

     

    체스판의 한 변의 길이로 주어지는 I의 최대값이 300이므로 시간복잡도는

    1. BFS 순회 - O(I ^ 2)

    한번으로 최대 90000번 계산을 하면 문제를 해결할 수 있다.

    따라서 시간초과는 걱정하지 않아도 된다.

    또한 자료형 역시 int 범위 내에서 모두 해결할 수 있다.


    풀이는 아래와 같다.

    import java.io.*;
    import java.util.*;
    
    
    public class Main {
        static FastReader scan = new FastReader();
        static StringBuilder sb = new StringBuilder();
    
        static int I;
        static int[][] dist;
        static int curX, curY;
        static int goalX, goalY;
    
        static int[] dy = {1, 1, 2, 2, -1, -1, -2, -2};
        static int[] dx = {2, -2, 1, -1, 2, -2, 1, -1};
    
        static void input() {
    
            I = scan.nextInt();
            curX = scan.nextInt();
            curY = scan.nextInt();
            goalX = scan.nextInt();
            goalY = scan.nextInt();
            dist = new int[I][I];
        }
    
        static void bfs() {
    
            int res = 0;
    
            Queue<int[]> que = new LinkedList<>();
            que.add(new int[]{curY, curX});
            dist[curY][curX] = 1;
    
            while (!que.isEmpty()) {
    
                int[] cur = que.poll();
                for (int i = 0; i < 8; i++) {
                    int ny = cur[0] + dy[i];
                    int nx = cur[1] + dx[i];
                    if (ny < 0 || nx < 0 || ny >= I || nx >= I) continue;
                    if (dist[ny][nx] != 0) continue;
                    que.add(new int[] {ny, nx});
                    dist[ny][nx] = dist[cur[0]][cur[1]] + 1;
                }
            }
            sb.append(dist[goalY][goalX] - 1).append('\n');
        }
    
    
    
        static void pro() {
            bfs();
        }
    
        public static void main(String[] args) {
    
            int test_case = scan.nextInt();
            while (test_case-- > 0) {
                input();
                pro();
            }
            System.out.println(sb);
        }
    
    
        static class FastReader {
            // BufferedReader의 빠른 속도,
            // + Scanner의 타입별 입력값을 받는 기능을 혼합
            // (자바 내부에 구현된 Scanner는 속도가 느림)
            // 다른분의 코드를 참고한 코드
            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. 5567 자바 : 결혼식  (0) 2023.04.12
    Q. 18404 자바 : 현명한 나이트  (2) 2023.04.11
    Q. 3055 자바 : 탈출  (0) 2023.04.09
    Q. 1697 자바 : 숨바꼭질  (0) 2023.04.08
    Q. 2178 자바 : 미로 탐색  (0) 2023.04.07

    댓글

Designed by Tistory.