티스토리 뷰

백준/실버

[백준 1063번] 킹 (C++)

게임개발기원 2025. 3. 4. 02:58

문제링크 : 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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함