티스토리 뷰
문제링크 : https://www.acmicpc.net/problem/1063
#include <bits/stdc++.h>
using namespace std;
//R, L, B, T, RT, LT, RB, LB
map<string, int> m = {
{"R", 0}, {"L", 1}, {"B", 2}, {"T", 3},
{"RT", 4}, {"LT", 5}, {"RB", 6}, {"LB", 7}
};
int dy[] = {0, 0, -1, 1, 1, 1, -1, -1};
int dx[] = {1, -1, 0, 0, 1, -1, 1, -1};
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(0);
string king, stone;
int n;
cin>> king >> stone >> n;
int ky = king[1] - '1';
int kx = king[0] - 'A';
int sy = stone[1] - '1';
int sx = stone[0] - 'A';
string s;
for(int i=0; i<n; i++)
{
cin >> s;
int dir = m[s];
int nky = ky + dy[dir];
int nkx = kx + dx[dir];
if(nkx < 0 || nkx >=8 || nky < 0 || nky >= 8 ) continue;
if(nkx == sx && nky == sy)
{
int nsy = sy + dy[dir];
int nsx = sx + dx[dir];
if(nsx < 0 || nsx >=8 || nsy < 0 || nsy >= 8 ) continue;
sy = nsy;
sx = nsx;
}
ky = nky;
kx = nkx;
}
cout << (char)(kx + 'A') << ky + 1 << '\n';
cout << (char)(sx + 'A') << sy + 1 << '\n';
return 0;
}
8방향을 검토하며 이동하는 문제이다.
8방향에 맞게 dy, dx 배열과 방향을 표시할 map을 선언해주었다.
입력받은 값에 대해서도 좌표 값을 설정해주자.
y 값의 경우 좌표로 0~7까지이기에 -'0'이 아닌 -'1'을 해주어야 한다.
이후에는 위 값들을 토대로 킹을 움직여 주면 된다.
문제에 주어진 조건에 따라 킹이 돌과 같은 곳으로 이동할 때는, 돌을 킹이 움직인 방향과 같은 방향으로 한 칸 이동시켜주어야 한다.
이는 킹을 움직인 방법을 그대로 적용시켜주면 되지만 여기서 주의할 점은 킹 좌표 갱신 시점이다.
만약 돌을 킹이 움직인 방향과 같은 방향으로 한 칸 이동시켰는데 범위 밖일 경우에는 그 이동을 건너 뛰어야 하므로, 킹이 움직인 것 또한 취소되어야 한다.
따라서 돌에 대한 범위 조건까지 모두 통과하고 나서야 킹의 좌표를 갱신해줄 필요가 있다.
이후 출력 부분에서는 좌표를 0~7로 계산했으므로 1을 더해서 실제 숫자와 일치시켜준다.
'백준 > 실버' 카테고리의 다른 글
[백준 10974번] 모든 순열 (C++) (0) | 2025.03.07 |
---|---|
[백준 10819번] 차이를 최대로 (C++) (0) | 2025.03.05 |
[백준 1057번] 토너먼트 (C++) (0) | 2025.03.02 |
[백준 1058번] 친구 (C++) (0) | 2025.03.02 |
[백준 17291번] 새끼치기 (C++) (0) | 2024.07.19 |