ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 Lv.3) 방문 길이
    알고리즘/프로그래머스 2020. 5. 29. 18:07
    반응형

    Summer/Winter Coding(~2018)

    방문 길이

     

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

     

    programmers.co.kr

    풀이

    간단한 시뮬레이션 문제였다. 로봇이 맵 정 중앙에서 시작해서 명령어에 따라 이동하는데, 맵 범위를 벗어나는 명령은 듣지 않는다는 조건이 있다. 움직이면서 처음 간 길이 몇 개인지 세는 문제다. 일단 제일먼저 한 것은 Pos 클래스를 만드는 것. 2차원 배열로 하면 귀찮고 한 라인에 코드가 길어지기 때문이다. 또한 URLD 명령에 따른 이동, Out of index 방지 메소드를 만들었다. 그리고 총 맵의 크기가 11인 것을 고려해보고 계산한 결과 14,xxx가 나오길래 그냥 4차원 배열로 visit 체크를 해주었다. (5,5에서 5,6으로 움직일 때 두 좌표를 이어주기 위해) 

     

    로직

    1. 좌표를 저장할 Pos 클래스를 만든다.

    2. 명령에 따라 좌표를 이동시킬 메소드(getCmdPos)를 만든다.

    3. 맵을 벗어나는지 체크하는 메소드를 만든다(isInArea)

    4. 명령에 따라 움직이면서, 맵에서 벗어나지 않을 경우, 방문한 적이 있는지 체크하고 새로운 길이면 cnt를 세준다.

     

     

    코드

    class Solution {
        public int solution(String dirs) {
            return go(dirs);
        }
        
        private int go(String dirs) {
            int result =0;
            int[][][][] map = new int[11][11][11][11];
            Pos robot = new Pos(5,5);
            
            for(int i=0; i<dirs.length(); i++) {
                char cmd = dirs.charAt(i);
                Pos cmdPos = getCmdPos(robot, cmd);
                if(isInArea(cmdPos.x, cmdPos.y)) {  // 맵
                    if(map[robot.y][robot.x][cmdPos.y][cmdPos.x] ==0) {
                        map[robot.y][robot.x][cmdPos.y][cmdPos.x] =1;
                        map[cmdPos.y][cmdPos.x][robot.y][robot.x] =1;
                        result++;
                    }
                    robot = cmdPos;
                }
            }
            return result;
        }
        
        private Pos getCmdPos(Pos robot, char cmd) {
            Pos result;
            int x = robot.x;
            int y = robot.y;
            switch(cmd) {
                case 'U':
                    result = new Pos(x,y-1);
                    break;
                case 'L':
                    result = new Pos(x-1,y);
                    break;
                case 'R':
                    result = new Pos(x+1,y);
                    break;
                case 'D':
                    result = new Pos(x,y+1);
                    break;
                default :
                    result = null;
                    break;
            }
            return result;
        }
        
        private boolean isInArea(int x, int y) {
            return x>=0 && x<=10 && y>=0 && y<=10 ? true : false;
        }
    }
    
    class Pos {
        int x;
        int y;
        
        public Pos(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
    반응형

    댓글

Designed by Tistory.