[C++] 백준 1063번: 킹
문제
난이도 : 실버 3
백준 1063번 : 킹
코드
#include <bits/stdc++.h>
using namespace std;
const int MAX = 8;
string dol, king;
int dy[] = { 0, 0, -1, 1, 1, 1, -1, -1 };
int dx[] = { 1, -1, 0, 0, 1, -1, 1, -1 };
int Translate(string move)
{
if (move == "R")
{
return 0;
}
else if (move == "L")
{
return 1;
}
else if (move == "B")
{
return 2;
}
else if (move == "T")
{
return 3;
}
else if (move == "RT")
{
return 4;
}
else if (move == "LT")
{
return 5;
}
else if (move == "RB")
{
return 6;
}
else if (move == "LB")
{
return 7;
}
}
void Move(string move)
{
string newKing = "";
int y = king[1] - '0';
int x = king[0] - 'A';
int ny, nx;
int dir = Translate(move);
ny = y + dy[dir];
nx = x + dx[dir];
if (ny <= 0 || nx < 0 || ny > MAX || nx >= MAX) return;
newKing += (char)(nx + 'A');
newKing += (char)(ny + '0');
if (newKing == dol)
{
string newDol = "";
int y = dol[1] - '0';
int x = dol[0] - 'A';
ny = y + dy[dir];
nx = x + dx[dir];
if (ny <= 0 || nx < 0 || ny > MAX || nx >= MAX) return;
newDol += (char)(nx + 'A');
newDol += (char)(ny + '0');
king = newKing;
dol = newDol;
}
else
{
king = newKing;
}
}
int main()
{
int N;
cin >> king >> dol >> N;
while (N--)
{
string move;
cin >> move;
Move(move);
}
cout << king << '\n';
cout << dol << '\n';
return 0;
}
설명
구현 + 시뮬레이션 문제
전체적인 순서는 킹이 움직임 -> 그 자리에 돌이 없으면 킹을 그냥 다음 자리에 배치 or 돌이 있으면 돌을 먼저 옮기고 킹을 배치
움직임을 구현하기 위해 그래프 문제에서 많이 사용하는 방향 벡터를 사용해서 dy, dx 배열을 만들어 상하좌우 대각선의 움직임을 만들었다.
R이나 B 같은 움직임을 입력받으면 Translate 함수에서 해당 방향 벡터의 인덱스를 리턴한다.
Move 함수로 가면 먼저 킹의 현재 좌표를 저장하고 이동할 방향벡터를 더해 ny, nx를 만든 후 ny, nx가 체스판 안에 있는지 체크해준다(이때 ny와 nx의 조건이 다른 점은 y와 x를 구할 때 y는 최솟값이 1이며 x는 최솟값이 0인 점을 고려해야함)
체스판 안에 있다면 킹의 새로운 위치인 newKing을 구한다. 만약 그 위치가 돌의 위치와 같지 않다면 킹의 위치를 업데이트 해주며 함수를 빠져나온다.
이동한 위치가 돌이 있는 곳이라면 돌을 똑같은 방향으로 움직인다. 만약 돌이 체스판을 벗어난다면 돌도 못 움직이고 킹도 못 움직이며 벗어나지 않는다면 돌과 킹의 위치를 새로 업데이트 해주면 된다.
결과
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.