#include <string>
#include <vector>
#include <map>
using namespace std;
typedef struct {
int x, y;
} coor;
vector<int> solution(vector<string> p, vector<string> r) {
pair<int, int> start;
int row = p.size();
int col = p[0].size();
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
if (p[i][j] == 'S')
start = make_pair(i,j);
map<char, int> map = {{'N', 0}, {'S', 1}, {'W', 2}, {'E', 3}};
coor movable[4] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
for (string route : r) {
char dir = map[route[0]];
int dis = route[2] - '0';
int nx = start.first;
int ny = start.second;
while (dis--) {
nx += movable[dir].x;
ny += movable[dir].y;
if ((nx < 0 || row <= nx || ny < 0 || col <= ny) || p[nx][ny] == 'X')
break;
}
if (dis < 0) start = make_pair(nx, ny);
}
return {start.first, start.second};
}
나동빈님의 알고리즘 유튜브에서 구조체 배열을 이용한 좌표값을 구해 체스 문제를 푸는 방법을 다시 기억해내서 풀어보았다. 미로 좌표 문제는 몇 문제 풀어 본 적이 없어서 이리저리 찾아보며 하느라 조금 오래 걸리긴 했는데 아주 오랜만에 좌표를 이용한 문제를 다시 상기시키는 문제였다.
map에 각 방향에 대한 번호를 저장, 그리고 movable이라는 구조체 배열에 각 번호에 어느 좌표로 이동할지를 저장한다.
그리고 r의 크기만큼 반복문을 돌며 각 좌표를 nx, ny에 저장하고, dis만큼 이동한 거리가 유효한지를 확인하면서 장애물 'X'가 있을 거나 벽에 막히면 break로 종료, 반복문을 나온 뒤 dis의 크기를 검사하고 0보다 작다면 정상적으로 루프를 종료했다는 의미이기 때문에 좌표값을 갱신해준다. 그리고 마지막으로 남은 좌표값을 vector에 바로 할당해서 return한다.