이 문제는 체스의 나이트가 출발지에서 목적지까지 이동할 때 최소 이동 횟수를 구하는 문제이다.
나이트의 이동 가능 좌표 dx, dy는 총 8가지로 설정할 수 있습니다. 나이트는 의 조합으로 움직이기 때문에, 이를 반영하여 이동 좌표를 정의한다.
출발지에서 목적지까지 이동할 때 최소 이동 횟수를 구하기 위해 BFS를 사용하여 거리 dist를 업데이트한다.
방문 여부를 저장하는 배열 board[x][y]는 매 테스트 케이스마다 새로 초기화해야 한다. 삼성 코딩 테스트와 같은 문제에서는 테스트 케이스별로 초기화가 중요한데, C++에서는 memset 함수를 통해 간단하게 초기화할 수 있다.
#define X first
#define Y second
#include <bits/stdc++.h>
using namespace std;
int N, l;
int board[302][302];
pair<int, int> start, target;
int dx[8] = {2, 2, -2, -2, 1, -1, 1, -1};
int dy[8] = {1, -1, 1, -1, 2, 2, -2, -2};
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N;
while(N--){
memset(board, 0, sizeof(board));
cin >> l;
int x, y;
cin >> x >> y;
start = {x, y};
cin >> x >> y;
target = {x, y};
queue<pair<int, int>> Q;
Q.push(start);
board[start.X][start.Y] = 1;
while(!Q.empty()){
auto cur = Q.front(); Q.pop();
if (cur == target) break;
for (int i = 0; i < 8; i++){
int nx = cur.X + dx[i], ny = cur.Y + dy[i];
if (nx < 0 || nx >= l || ny < 0 || ny >= l) continue;
if (board[nx][ny] > 0) continue;
Q.push({nx, ny});
board[nx][ny] = board[cur.X][cur.Y] + 1;
}
}
cout << board[target.X][target.Y] - 1 << "\n";
}
}
오늘의 문제는 삼성 코딩 테스트 유형과 형식을 연습하기에 좋은 문제이다. 최근 SW 역량 테스트 준비를 통해 익숙해진 덕분에 11분 만에 문제를 풀 수 있었다.
시뮬레이션 문제 + BFS 유형을 조합한 형식으로 나오는 경우가 많아, 워밍업으로 좋은 문제인 것 같다.memset 함수를 쓰면 간편하게 초기화할 수 있으니 쓰는 것을 추천한다.