엄지월드

백준 7562 나이트의 이동 본문

알고리즘

백준 7562 나이트의 이동

킨글 2022. 8. 22. 17:18

문제 접근

- 8가지 방향으로 이동하는 문제이다.

- DFS로 분류하고 문제를 선택한 것으로 인지 했었어서 어떻게 풀어야 하나 고민했다.

아무리 고민해 봐도 BFS 문제로 보여서 문제의 분류를 보니 BFS였다.

 

헷갈렸던 부분

- for문 안에서 이동 횟수를 1을 더해주니 여러번 움직였을 때에 cnt 출력 값은 맞았지만,

1번만 이동 했을 때에 cnt 출력 값은 0으로 나오는 문제가 있었다. 

문제를 파악해보니, for문을 돌 때마다 People의 cnt 값을 더해주기 때문에 올바르지 못한 방법이었다. 

그래서 고민한 결과 for문 위로 cnt 값을 빼주어서 해결하였다. 

- 오랫만에 BFS 풀었던 문제이다. 잊지 않도록 한번씩 리마인드 겸으로 풀어주면 좋을듯하다. 

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.Buffer;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
    static int N;
    static boolean[][] visited;
    static class People{
        int x;
        int y;
        int cnt;

        public People(int x, int y, int cnt) {
            this.x = x;
            this.y = y;
            this.cnt = cnt;
        }
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int loop = Integer.parseInt(br.readLine());
        for(int i=0; i<loop; i++){
            N = Integer.parseInt(br.readLine());
            StringTokenizer st = new StringTokenizer(br.readLine());
            int startX = Integer.parseInt(st.nextToken());
            int startY = Integer.parseInt(st.nextToken());
            st = new StringTokenizer(br.readLine());
            int endX = Integer.parseInt(st.nextToken());
            int endY = Integer.parseInt(st.nextToken());
            visited = new boolean[N][N];

            System.out.println(bfs(startX, startY, endX, endY));
        }
    }
    public static int bfs(int sx, int sy, int ex, int ey){
        if(sx == ex && sy == ey) return 0;
        int dx[] = {1, 2, 2, 1, -1, -2, -1, -2};
        int dy[] = {2, 1, -1, -2, 2, 1, -2, -1};
        visited[sx][sy] = true;
        Queue<People> q = new LinkedList<>();
        q.add(new People(sx, sy, 0));

        while(!q.isEmpty()) {
            People p = q.poll();
            int cnt = p.cnt;
            cnt += 1;
            for (int i = 0; i < dx.length; i++) {
                int nx = dx[i] + p.x;
                int ny = dy[i] + p.y;

                if (nx == ex && ny == ey) {
                    return cnt;
                }

                if (nx < 0 || ny < 0 || nx >= N || ny >= N) continue;
                if (visited[nx][ny]) continue;


                visited[nx][ny] = true;

                q.add(new People(nx, ny, cnt));
            }
        }
        return 0;
    }
}

'알고리즘' 카테고리의 다른 글

백준 11725 트리의 부모 찾기(DFS)  (0) 2022.08.26
백준 1987 알파벳(DFS)  (0) 2022.08.23
백준 2468 안전영역  (0) 2022.08.19
[Leetcode] sliding window median java  (0) 2022.08.13
[프로그래머스] 가사 검색  (0) 2022.08.11
Comments