#include <string>
#include <string.h>
#include <map>
#define ROW 6
#define COL 6
using namespace std;
typedef struct {
int x, y;
} coor;
int solution(string dirs) {
int answer = 0;
pair<int, int> s = {0, 0};
map<pair<pair<int, int>, pair<int, int>>, int> donePath;
map<char, int> map = {{'U', 0}, {'D', 1}, {'L', 2}, {'R', 3}};
coor mov[4] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
for (const auto& route : dirs) {
char dir = map[route];
coor next = {s.first + mov[dir].x, s.second + mov[dir].y};
if ((next.x < -5 || ROW <= next.x || next.y < -5 || COL <= next.y)) {
continue;
}
if (!donePath[{{s.first, s.second}, {next.x, next.y}}]) {
answer++;
donePath[{{s.first, s.second}, {next.x, next.y}}]++;
donePath[{{next.x, next.y}, {s.first, s.second}}]++;
}
s = {next.x, next.y};
}
return answer;
}
10X10 좌표평면에서 지나간 길이 몇개인지 찾는 문제다.
시작점 0,0에서 시작하고, U D L R 4가지 방향을 map과 mov로 정의한 후, 좌표평면 밖으로 나가지 않는다면 체크한다.
여기서 주의해야 할 점은 donePath에 지나온 길을 기록할 때 양방향으로 기록해야 한다는 점이다.
한 방향만 기록한다면 그 길을 다시 돌아올 때는 새로운 길로 인식하기 때문이다.
그리고 continue에서 넘어가지 않았다면 s에 다음 위치를 기록한 next를 할당하여 현재 위치를 최신화한다.