방문길이

NJW·2022년 3월 17일
0

코테

목록 보기
16/170

들어가는 말

좌표평면(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;
}

참고

https://greenapple16.tistory.com/70

profile
https://jiwonna52.tistory.com/

0개의 댓글