백준

[백준 / JAVA] 7562. 나이트의 이동

baefrica 2023. 8. 6. 15:25
반응형

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

 

7562번: 나이트의 이동

체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수

www.acmicpc.net

 


💻 풀이 결과

 

💯 최종 코드

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

class Node {
	int r, c;

	Node(int r, int c) {
		this.r = r;
		this.c = c;
	}
}

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int T = sc.nextInt();
		for (int tc = 0; tc < T; tc++) {
			int I = sc.nextInt();
			int[][] board = new int[I][I];

			int nowX = sc.nextInt();
			int nowY = sc.nextInt();

			int nextX = sc.nextInt();
			int nextY = sc.nextInt();

			Queue<Node> queue = new LinkedList<>();
			int cnt = 0;

			queue.add(new Node(nowY, nowX));
			board[nowY][nowX] = cnt;

			int[] dr = { -1, -2, -2, -1, 1, 2, 2, 1 };
			int[] dc = { -2, -1, 1, 2, -2, -1, 1, 2 };

			while (!queue.isEmpty()) {
				int size = queue.size();
				cnt++;

				for (int s = 0; s < size; s++) {
					Node curr = queue.poll();
					// 탈출 조건
					if (curr.r == nextY && curr.c == nextX) {
						queue.clear();
						System.out.println(board[curr.r][curr.c]);
						break;
					}

					for (int d = 0; d < 8; d++) {
						int nr = curr.r + dr[d];
						int nc = curr.c + dc[d];

						// 기저조건
						if (nr < 0 || nc < 0 || nr >= I || nc >= I) {
							continue;
						}
						if (board[nr][nc] > 0) {
							continue;
						}

						queue.add(new Node(nr, nc));
						board[nr][nc] = cnt;
					}
				}
			}

		}
	}
}

💢 틀린 이유

  • dr, dc 배열을 잘못 설정하는 실수를 해서 계속 틀린 결과가 나왔다..
  • nextY를 행으로, nextX를 열로 잡았는데, 처음 큐에 삽입할 때 (nowX, nowY)로 해서 행, 열 설정이 잘못되어 있었다.

💬 풀이 과정

  • BFS를 돌리면서 8방 탐색을 하였다.
  • 큐에 삽입을 할 때 보드판에 이동 횟수(cnt)를 저장한다.
  • 방문 검사는 이동 횟수가 저장이 되어 있는지로 판별하였다.
  • 큐에서 하나씩 꺼낼 때 도착지점이라면 큐를 비우고 이동 횟수(cnt)를 출력한다.

💡 깨달은 점

1. 사소한 실수

  • 사소한 실수를 하지 않도록 설정을 잘해주어야 할 것 같다.
반응형