새소식

반응형
250x250
Programmers/Lv.1

프로그래머스 - 공원 산책

  • -
728x90
반응형

 

이번 문제의 주요 로직은 다음과 같다.

 

  1. 공원의 초기 상태 파악하기: 문자열 배열 park를 이용하여 공원의 상태를 2차원 배열 newPark에 저장한다. 이때, 산책 시작 위치도 함께 저장한다.
  2. 명령에 따라 이동 처리하기: 문자열 배열 routes에 담긴 각 명령을 분석하여 이동할 방향과 거리를 결정한다. 이때, move 메소드를 호출하여 실제 이동 처리를 진행한다.
  3. 이동 가능 여부 확인하기: move 메소드 내에서는 산책 도중 공원을 벗어나거나 장애물에 부딪히는지 확인한다. 만약 이동 중 장애물을 만나거나 공원 경계를 벗어나려고 한다면, 해당 명령을 무시하고 위치를 조정하지 않는다.

먼저 공원의 초기 설정이다.

for(int i = 0; i < park.length; i++) {
    for(int j = 0; j < park[0].length(); j++) {
        newPark[i][j] = park[i].charAt(j);
        if(park[i].charAt(j) == 'S') {
            start[0] = i;
            start[1] = j;
        }
    }
}

 

공원의 각 칸을 순회하며 newPark 배열에 정보를 저장한 뒤, 산책을 처음 시작할 위치도 저장한다.

 

그 후 명령에 따른 이동 처리를 한다.

for(int i = 0; i < routes.length; i++) {
    String direction = routes[i].split(" ")[0];
    int distance = Integer.parseInt(routes[i].split(" ")[1]);
    move(direction, distance);
}

 

각 명령을 분석하여 이동 거리와 방향을 결정한 후, move 메소드를 활용하여 움직인다.

 

move메소드의 이동 로직 구현

public static void move(String way, int distance, int[] start, char[][] newPark) {
        switch(way) {
            case "N" : int y = start[1];
                if(y - distance < 0) break;
                for(int i = 1; i <= distance; i++) {
                    y--;
                    if(newPark[y][start[1]] == 'X') {
                        y =+ i;
                        start[1] = y;
                        break;
                    }
                    start[1] = y;
                }
                break;
            case "E" : int x = start[0];
                if(x + start[0] > newPark[0].length - 1) break;
                for(int i = 1; i <= distance; i++) {
                    x++;
                    if(newPark[start[1]][x] == 'X') {
                        x =- i;
                        start[0] = x;
                        break;
                    }
                    start[0] = x;
                }
                break;
            case "W" : x = start[0];
                if(x - distance < 0) break;
                for(int i = 1; i <= distance; i++) {
                    x--;
                    if(newPark[start[1]][x] == 'X') {
                        x =+ i;
                        start[0] = x;
                        break;
                    }
                    start[0] = x;
                }
                break;
            case "S" : y = start[1];
                if(y + distance > newPark[0].length - 1) break;
                for(int i = 1; i <= distance; i++) {
                    y++;
                    if(newPark[y][start[0]] == 'X') {
                        y =- i;
                        start[1] = y;
                        break;
                    }
                    start[1] = y;
                }
                break;
        }
    }

 

  • move 메소드는 로봇 강아지의 이동을 시뮬레이션하는 핵심 부분이다. 로봇이 이동할 때마다 경계 체크와 장애물 체크를 수행하여 안전한 이동 경로를 보장한다.
  • 이동 중 장애물에 부딪히거나 공원의 경계를 넘으려고 하면, 해당 명령은 무시하고 로봇의 위치를 업데이트하지 않거나 이동을 즉시 중단한다.
728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.