[programmers]アクセス長


問題の説明


4つのコマンドでゲームキャラクターを移動したいです.コマンドは次のとおりです.
  • U:上へ
  • D:下段
  • R:右一マス
  • L:左一マス
  • キャラクタは、座標平面(0,0)の位置から開始します.座標平面の境界は、左上角(-5、5)、左下角(-5、-5)、右上角(5、5)および右下角(5、-5)からなる.

    たとえば、コマンドが「ULURRDLLU」の場合
  • 1番から7番まで:
  • 8番から9番まで:
  • このとき,ゲームキャラクタが歩いた道の中でキャラクタが初めて歩いた道の長さを要求する.たとえば、上記の例では、ゲームキャラクタが移動する長さは9ですが、キャラクタが最初に歩く長さは7です.(8、9番命令で移動した道はすでに2、3番命令で通っています)
    ただし、座標平面の境界を超えたコマンドは無視されます.
    たとえば、コマンドがLULLLUの場合
  • 1号命令から6号命令に従って移動し、7,8号命令を無視します.さらに9番の命令に従って行動します.
  • このときキャラクターが初めて歩く道の長さは7です.
    コマンドにパラメータdirsが付与されると、ゲームキャラクタが初めて歩く道の長さを求め、returnのsolution関数を完了する.

    せいげんじょうけん

  • dirsは、「U」、「D」、「R」および「L」を除いて文字列形式で与えられる.
  • dirsの長さは500以下の自然数である.
  • ソースコード

    class Solution {
        int[] dx = {0, 0, 1, -1}; // U, D, R, L
        int[] dy = {1, -1, 0, 0};
        public int solution(String dirs) {
            int answer = 0;
            boolean[][][][] visited = new boolean[11][11][11][11];
            
            // 배열 인덱스에 음수를 넣을 수 없으므로 -5~5를 0~10으로 변환
            int x = 5, y = 5; // (0,0) -> (5,5)
            char[] ch = dirs.toCharArray();
            for(Character c : ch) {
                int nx = x, ny = y; // 움직일 좌표
                if(c == 'U') {
                    nx += dx[0];
                    ny += dy[0];
                } 
                else if(c == 'D') {
                    nx += dx[1];
                    ny += dy[1];
                }
                else if(c == 'R') {
                    nx += dx[2];
                    ny += dy[2];
                }
                else if(c == 'L') {
                    nx += dx[3];
                    ny += dy[3];
                }
                // 좌표평면을 벗어나는지 Check
                if(nx > 10 || nx < 0 || ny > 10 || ny < 0) {
                    continue;
                }
                
                // UDU는 1이 됨을 고려해야함!!
                // 그러므로 어디서 출발했는지도 체크해야 함
                if(!visited[nx][ny][x][y] && !visited[x][y][nx][ny]) {
                    visited[nx][ny][x][y] = true;
                    visited[x][y][nx][ny] = true;
                    answer += 1;
                }
                x = nx;
                y = ny;
            }
            return answer;
        }
    }

    Review


    配列インデックスは負数ではないことを考慮する必要があります.
    だから私は-5から5の座標の代わりに0から10を使います.
    UDUの場合も考えるべきです.
    この場合、歩いた経路は歩いた経路と同じなので、歩いた経路の長さは1!
    どこから出発するのかチェックするために、見学の列を4次元にしました.
    -終了-