[구현] [프로그래머스] 공원 산책 (Java)

eunsil·2024년 8월 13일
0

유형: 그래프 탐색
문제: 프로그래머스 - 공원 산책

문제



풀이

문자열 배열로 이루어진 그리드 탐색문제이다. 기본적으로 상하좌우 탐색하는 문제인 줄 알았는데 맞긴한데 문제를 정말 잘 읽어야 한다...


제대로 문제를 읽지 않아 헤맸던 조건은

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

이동했을 때 장애물이 있는지가 아닌, 이동하는 범위 내에 장애물이 있는지 확인해야 한다!
여기서 되게 헤맸다.


로직

  1. 시작 지점 찾기 sh sw
  2. 명령에 따른 임시 위치 저장 nh nw
    • 최종 임시 위치까지 1칸씩 이동
  3. 유효 범위 체크
  4. 이동 범위 내에 장애물이 있다면 이동 불가능 break
  5. 장애물이 없다면 nh nw 의 값을 sh sw 에 대입

한 칸씩 이동하면서 장애물을 확인한 이유
sh sw 부터 nh nw 까지의 범위를 확인해야 하는데, 어떤 변수를 기준점으로 잡아야 하는지 동, 서, 남, 북에 따라 모두 달라지기 때문에 비슷한 코드를 4개 작성해야 하는 것을 원하지 않았음



코드

class Solution {
    public int[] solution(String[] park, String[] routes) {
        int H = park.length; // 세로
        int W = park[0].length(); // 가로

        /*
        시작 지점 찾기
         */
        int sh = 0;
        int sw = 0;
        
        for (int i = 0; i < park.length; i++) {
            if (park[i].contains("S")) {
                sh = i;
                sw = park[i].indexOf("S");
            }
        }

        /*
        산책
         */
        for (String route : routes) {
            int nh = sh;
            int nw = sw;
            int direction = route.charAt(0);
            int move = Character.getNumericValue(route.charAt(2));

            for (int i = 0; i < move; i++) {
                if (direction == 'N') nh--;
                if (direction == 'S') nh++;
                if (direction == 'W') nw--;
                if (direction == 'E') nw++;

                if (nh >= 0 && nh < H && nw >= 0 && nw < W) { // 유효 범위
                    if (park[nh].charAt(nw) == 'X') break; // 이동 범위 내 장애물 유무

                    if (i == move-1) {
                        sh = nh;
                        sw = nw;
                    }
                }

            }
        }
        
        int[] answer = new int[2];
        answer[0] = sh;
        answer[1] = sw;
        
        return answer;
    }
}

0개의 댓글