[프로그래머스] - 공원산책

YongHyun·2023년 5월 24일
0
post-thumbnail

공원 산책

문제 풀이

문제는 단순하다. 2차원 배열을 만들고 S(시작점) 으로부터 이동할 수 있는 곳이면 이동 그렇지 않다면 취소하면 되는 문제이다. 다만 2차원 배열을 만드는 것은 크게 어려움은 없었지만 이동할 수 있는 조건을 만드는 과정에서 참 많이 애를 먹었던 것 같다.

로봇 강아지는 명령을 수행하기 전에 다음 두 가지를 먼저 확인합니다.

  • 주어진 방향으로 이동할 때 공원을 벗어나는지 확인합니다.
  • 주어진 방향으로 이동 중 장애물을 만나는지 확인합니다.

만약 park가 ["SOOO", "OOOO", "XOOOO"] 이고 시작점은 [0,0]
routes 가["W 2", "N 2", "S 2"] 로 주어졌다고 가정하면

| W 2 |

  1. 주어진 방향 W 로 2만큼 이동하면 위치가 0보다 작아지기 때문에 불가능하다.

| N 2 |

  1. 주어진 방향 N로 2만큼 이동하면 위치가 0보다 작아지기 때문에 불가능하다.

| S 2 |

  1. 주어진 방향 S로 2만큼 이동하면 위치가 park.length 보다는 작기 때문에 가능하다
  2. 2만큼 이동하였을 때 "X" 가 있다면 그 위치로 이동할 수 없기 때문에 취소한다.

라고 설명할 수 있다. 결국에는 2차원 배열을 생성한 후 S(시작점)을 기준으로 범위가 같은지 그리고 X 라는 장애물이 없는지 확인하여서 이동시키면 된다. 코드를 좀 지저분하게 해서라도 코드는 완성 시킬 수 있다.

class Solution {
    public int[] solution(String[] park, String[] routes) {
        int[] answer = new int[2];
        String[][] park_map = new String[park.length][park[0].length()];

        for(int i = 0; i < park_map.length; i++) {
            String[] row = park[i].split("");
            for(int j = 0; j < park_map[i].length; j++) {
                if(row[j].equals("S")) {
                    answer[0] = i;
                    answer[1] = j;
                }
                park_map[i][j] = row[j];
            }
        }

        for(int i = 0; i < routes.length; i++) {
            String[] route = routes[i].split(" ");
            int n = Integer.parseInt(route[1]);
            boolean check = false;
            if(route[0].equals("N") && answer[0] - n >= 0){
                for(int j = 1; j <= n; j++) {
                    if(!park_map[answer[0] - j][answer[1]].equals("X"))
                        check = true;
                    else {
                        check = false;
                        break;
                    }
                }
                if(check)
                    answer[0] -= n;
            }else if(route[0].equals("S") && answer[0] + n < park_map.length){
                for(int j = 1; j <= n; j++) {
                    if(!park_map[answer[0] + j][answer[1]].equals("X"))
                        check = true;
                    else {
                        check = false;
                        break;
                    }
                }
                if(check)
                    answer[0] += n;
            }else if(route[0].equals("E") && answer[1] + n < park_map[0].length){
                for(int j = 1; j <= n; j++) {
                    if(!park_map[answer[0]][answer[1] + j].equals("X"))
                        check = true;
                    else {
                        check = false;
                        break;
                    }
                }
                if(check)
                    answer[1] += n;
            }else if(route[0].equals("W") && answer[1] - n >= 0){
                for(int j = 1; j <= n; j++) {
                    if(!park_map[answer[0]][answer[1] - j].equals("X"))
                        check = true;
                    else {
                        check = false;
                        break;
                    }
                }
                if(check)
                    answer[1] -= n;
            }
        }
        return answer;
    }
}

회고

문제가 어려웠던 것은 아닌데 코드를 짜다보니 내가 점 점 이해하기 힘들어졌다. 가독성이 떨어지고 반복되는 코드가 있다보니 정말 좋은 코드는 아니라는 것을 알게 되었고 문제 풀었어도 뭔가 성취감이 없었던것 같다... 다른 사람의 풀이를 보니 아직 한참 멀었다는 생각을 가지게 되는 문제였던 것 같다.

profile
백엔드 개발자 되기 위한 여정

0개의 댓글