Development Logs/Algorithms

[JAVA] 프로그래머스 : 방문 길이 (Summer/Winter Coding(~2018))

유뱅유뱅뱅 2020. 9. 1. 15:10

https://programmers.co.kr/learn/courses/30/lessons/49994?language=java

 

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

 

programmers.co.kr

구현 문제이다.

처음 가본 길이를 구하는 알고리즘을 구현하면 된다.

 

해결 방안

문제를 크게 보면 dirs를 돌면서 게임 캐릭터를 움직여준다.

캐릭터 움직이는 함수는 moveCharacter이다.

1. char형 dir에 의해 nx, ny를 정해준다.

2. nx, ny의 범위를 확인해준다.
2.1 구해진 nx, ny가 -5~5 => 0~10이 되므로 nx, ny 둘 중 하나라도 0~10 범위를 벗어나면 해당 과정은 아무것도 안한다.

2.2. nx, ny가 둘다 0~10 범위 안에 든다면 이동을 하게 되는데 boolean형 4차원 배열을 이용하여 방문하지 않은 경우에 answer값을 +1 해주고 방문 체크를 해준다. cx,cy에서 nx,ny를 갈때 방향성을 가지지 않으므로 visited[cx][cy][nx][ny], visited[nx][ny][cx][cy] 둘다 true로 값을 변경해준다.
그리고 cx, cy를 nx, ny로 변경해준다. 

 

코드

// 방문 길이
// 캐릭터가 처음 걸어본 길이를 구하려고 함
// 좌표 평면의 경계를 넘어가는 명령어는 무시함
class Solution {
    
    static int answer = 0;
    
    // 현재 시작 위치
    static int cx = 5;
    static int cy = 5;
    static boolean[][][][] visited = new boolean[11][11][11][11];
    
    // U D R L 순
    static int[] dx = {0, 0, 1, -1};
    static int[] dy = {1, -1, 0, 0};
    
    public int solution(String dirs) {
        
        for(int i=0; i<dirs.length(); i++){
            char dir = dirs.charAt(i);
            
            moveCharacter(dir);
        }
        
        return answer;
    }
    
    // 경계 넘어가는지 체크(true면 경계 안)
    // 0~10
    static boolean inBoundary(int x, int y){
        if(x<0 || x>10 || y<0 || y>10)
            return false;
        
        return true;
    }
    
    static void moveCharacter(char dir){
        int nx = 0;
        int ny = 0;
        // 1. nx, ny 구해주기
        switch (dir){
            case 'U' :
                nx = cx + dx[0];
                ny = cy + dy[0];
                break;

            case 'D' :
                nx = cx + dx[1];
                ny = cy + dy[1];
                break;

            case 'R' :
                nx = cx + dx[2];
                ny = cy + dy[2];
                break;

            case 'L' :
                nx = cx + dx[3];
                ny = cy + dy[3];
                break;
        }

        // 2. nx, ny가 경계 넘어가는지 확인
        if(inBoundary(nx,ny)){

            // 3. 경계 안넘어가면 이동
            // 방문 안한 곳 이면 방문 체크 하고 answer++;
            if(!visited[nx][ny][cx][cy] && !visited[cx][cy][nx][ny]){
                visited[cx][cy][nx][ny] = true;
                visited[nx][ny][cx][cy] = true;
                answer++;
            }
            // 이동
            cx = nx;
            cy = ny;
        }
        
    }
}