알고리즘

프로그래머스 방문 길이 (JAVA)

박카스마시며코딩 2022. 5. 28. 18:58

https://programmers.co.kr/learn/courses/30/lessons/49994

 

코딩테스트 연습 - 방문 길이

 

programmers.co.kr

 

저는 boolean배열을 통해 문제를 해결하였습니다.

boolean배열을 visited[y][x][방향]으로 하여 현재 지점에서 가는 방향으로 방문 체크를 하였습니다.

하지만 문제는 처음 가본 길의 길이기 때문에 저는 도착지점에서 출발지점의 방문체크도 같이 진행하였습니다.

이후 visited가 false라면 결과값을 늘리고 아니라면 늘리지 않았습니다.

 

class Solution {
    private static final int[] dy = {-1,0,1,0};
    private static final int[] dx = {0,1,0,-1};
    
    private static final char UP = 'U';
    private static final char DOWN = 'D';
    private static final char RIGHT = 'R';
    private static final char LEFT = 'L';
    
    private static final int SIZE = 5;
    
    public int solution(String dirs) {
        int answer = cal(dirs);
        return answer;
    }
    
    private int cal(String dirs){
        int result = 0;
        int y = 0;
        int x = 0;
        boolean[][][] visited = new boolean[2 * SIZE + 2][2 * SIZE + 2][4];
        for(int i = 0 ; i < dirs.length() ; i++){
            char dirCh = dirs.charAt(i);
            int dir = detectDir(dirCh);
            int ny = y + dy[dir];
            int nx = x + dx[dir];
            if(checkBound(ny,nx)){
                if(!visited[y+SIZE][x+SIZE][dir]){
                    result++;
                    visited[y+SIZE][x+SIZE][dir] = true;
                    visited[ny+SIZE][nx+SIZE][(dir+2)%4] = true;
                }
                y = ny;
                x = nx;
            }
        }
        return result;
    }
    private static int detectDir(char dirCh){
        if(dirCh == UP){
            return 2;
        }
        if(dirCh == DOWN){
            return 0;
        }
        if(dirCh == RIGHT){
            return 1;
        }
        if(dirCh == LEFT){
            return 3;
        }
        return -1;
    }
    private static boolean checkBound(int y,int x){
        if(y >= -SIZE && y <= SIZE && x >= -SIZE && x <= SIZE){
            return true;
        }
        return false;
    }
    
}