좌표평면(5,5)에서 게임 캐릭터가 움직이는 길이를 측정하는 문제다. 단, (5,5)를 넘어서는 안되고 같은 길을 반복해서 가면 움직이는 길이에 추가하지 않는다.
처음에는 벡터 2차원으로 좌표를 생각하면서 풀었다. 그런데, 자꾸 두 번째 예제가 안 풀리는 거 아닌가. 그래서 찾아봤더니 2차원 좌표로 풀면 안되고 4차원으로 움직이는 길을 표시해줘야 한다는 걸 배웠다.
일단 map으로 4차원 배열을 만든다. 다음 x와 y에 5를 넣고 dirs의 길이만큼 반복문을 돌린다. 각 조건문을 쓸 때 문자에 맞는 내용을 쓰면 되는 데, +인 경우에는 x 혹은 y가 10보다 작게(움직인 거리가 10을 넘으면 안 된다) -인 경우에는 x 혹은 y가 0보다는 크게 나와야 한다(움직인 거리가 0보다 작으면 안 된다).
만일 가려는 거리가 방문이 안 됐다면(1이 아니라면) 양 쪽에 1 표시를 해주면 된다. 4차원이라서 양쪽에 해줘야 한다는 걸 주의해야 한다. 그리고 문자에 맞춰 x 혹은 y에 1을 더해주거나 빼주면 된다.
#include <string>
using namespace std;
int solution(string dirs) {
int answer = 0;
int map[11][11][11][11];
int x = 5;
int y = 5;
for(int i=0; i<dirs.length(); i++){
if(dirs[i] == 'U'){
if(y < 10){
if(map[x][y][x][y+1] != 1){
map[x][y][x][y+1] = 1;
map[x][y+1][x][y] = 1;
answer++;
}
y++;
}
}else if(dirs[i] == 'D'){
if(y > 0 ){
if(map[x][y][x][y-1] != 1){
map[x][y][x][y-1] = 1;
map[x][y-1][x][y] = 1;
answer++;
}
y--;
}
}
else if(dirs[i] == 'R'){
if(x < 10){
if(map[x][y][x+1][y] != 1){
map[x][y][x+1][y] = 1;
map[x+1][y][x][y] = 1;
answer++;
}
x++;
}
}else if(dirs[i] == 'L'){
if(x > 0){
if(map[x][y][x-1][y] != 1){
map[x][y][x-1][y] = 1;
map[x-1][y][x][y] = 1;
answer++;
}
x--;
}
}
}
return answer;
}