핵심 아이디어

<aside> 💡

엄청난 구현 문제

</aside>

c++의 enum 자료형을 통해 조금 더 가독성 좋게 구현해봤다.


코드

#include <bits/stdc++.h>
#define FASTIO ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
using namespace std;
typedef long long int ll;

enum WASD {W, A, S, D};
enum EVNT {DOWN, STAY, UP};
// 0:w, 1:a, 2:s, 3:d
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, -1, 0, 1};

int n, m;
int a[111][111];
int r = 0, c = 0;

int evnt[4];
int cmd[1'000'005];

void setEvnt(int idx)
{
    string s;
    cin >> s;
    
    if(s == "Down") evnt[idx] = DOWN;
    else if(s == "Stay") evnt[idx] = STAY;
    else if(s == "Up") evnt[idx] = UP;
    else assert(false);
}

signed main()
{
    FASTIO;
    cin >> n >> m;
    vector<vector<int> > a(n+5, vector<int>(n+5, 1));
    for(int i = 1; i<=n; i++){
        for(int j = 1; j<=n; j++){
            cin >>a[i][j];

            if(a[i][j] == 2){
                r = i;
                c = j;
                a[i][j] = 0;
            }
        }
    }

    setEvnt(W);
    setEvnt(A);
    setEvnt(S);
    setEvnt(D);
    
    for(int i = 1; i<=m; i++){
        char cur; cin >> cur;
        if(cur == 'W') cmd[i] = W;
        else if(cur == 'A') cmd[i] = A;
        else if(cur == 'S') cmd[i] = S;
        else if(cur == 'D') cmd[i] = D;
        else assert(false);
    }
    cmd[0] = -1;
    cmd[m+1] = -1;
    
    for(int i = 1; i<=m; i++){
        bool isDown = false;
        bool isStay = false;
        bool isUp = false;

        if(cmd[i] == cmd[i-1]){
            isStay = true;
        }
        else{
            isDown = true;
            isUp = true;
        }

        for(int t = 0; t<4; t++){
            int nr = r+dx[t];
            int nc = c+dy[t];

            if(cmd[i] == t){
                if(evnt[t] == DOWN && isDown && !a[nr][nc]) { r = nr; c = nc; }
                if(evnt[t] == STAY && isStay && !a[nr][nc]) { r = nr; c = nc; }
            }

            if(isUp && cmd[i-1] == t){
                if(evnt[t] == UP && !a[nr][nc]) { r = nr; c = nc; }
            }
        }
    }

    cout << r << " " << c;

    return 0;
}

문제 조건이 이해하는데에 조금 어려웠다.