Algorithm

[프로그래머스 레벨 1] 공원 산책

Ray901104 2024. 2. 6. 19:24

문제

 

접근 방법

1. 로봇 강아지의 시작 위치를 찾습니다.

2. 이동할 위치가 공원 밖을 벗어나거나, 장애물이 있는지 확인합니다.

3. 2번의 케이스 중 하나라도 해당되는 경우, 로봇 강아지는 이동하지 않고 다음 명령을 수행합니다.

4. 최종 위치를 answer 배열에 담아 리턴해주면 됩니다.

 

풀이 과정

먼저, 필요한 변수들을 선언해주고 로봇 강아지의 시작 위치를 찾는 것이 우선입니다.

강아지의 시작 위치를 찾았다면, (x, y) 좌표에 각각의 값을 할당해줍니다. 이 때 헷갈리시면 안되는게, x 좌표 라고 해서 배열의 가로이동을 생각하시면 안됩니다! (x, y) 좌표를 표시할 경우 2차원 배열에서는 arr[y][x] 가 됩니다. 즉 y가 높이, x가 너비 라고 생각했을 때 arr[y][x]로 표시를 해야하는 것이죠.

 

하지만 저는 그게 더 헷갈려서 arr[x][y]로 표시하기 위해 아래 처럼 로봇의 시작 위치를 정할 때 x = i, y = park[i].indexOf("S") 로 지정한 것입니다.

int[] answer = new int[2]; // 최종 답안을 저장할 배열
int[] dx = {-1, 0, 1, 0}; // x 좌표 이동을 위한 배열
int[] dy = {0, 1, 0, -1}; // y 좌표 이동을 위한 배열
int direction = 0; // 이동 방향을 결정할 변수
int height = park.length; // 공원의 높이
int weight = park[0].length(); // 공원의 너비(가로길이)
int x = 0, y = 0; // 로봇 강아지의 위치를 저장할 (x,y) 좌표

//로봇 위치 찾기
for(int i = 0; i < park.length; i++) {
    if(park[i].contains("S")) {
        x = i;
        y = park[i].indexOf("S");
    }
}

 

로봇의 시작 위치를 찾았다면, 이제 routes 배열에 담긴 '이동방향'과 '이동거리'에 따라 한 칸씩 움직여봅니다. 이 때 장애물이 있거나, 공원의 크기를 넘어가는 위치라면 해당 명령을 무효처리하고 다음 명령을 수행해야 합니다.

for(int i = 0; i < routes.length; i++) {
    // 이동 방향에 따라 direction 값을 지정
    switch(routes[i].split(" ")[0]) {
        case "E" :
            direction = 1;
            break;
        case "S" :
            direction = 2;
            break;
        case "W" :
            direction = 3;
            break;
        case "N" :
            direction = 0;
            break;
    }

    int moveCount = Integer.parseInt(routes[i].split(" ")[1]); // 이동거리
    int nx = x; // 이동할 거리를 시작 지점으로 초기화(해당 명령이 무효일 경우 롤백 처리하기 위해)
    int ny = y; // 이동할 거리를 시작 지점으로 초기화(해당 명령이 무효일 경우 롤백 처리하기 위해)
    boolean flag = true; // 이동할 것인지 무효처리할 것인지 구분할 flag
    for(int j = 0; j < moveCount; j++) {
        nx += dx[direction];
        ny += dy[direction];
        
        // 아래 조건 중 하나라도 해당되는 경우 롤백처리를 위한 flag 값 지정 후 break
        if(nx < 0 || nx >= height || ny < 0 || ny >= weight || park[nx].charAt(ny) == 'X') {
            flag = false;
            break;
        }
    }
    // 명령이 수행될 경우 로봇 강아지의 위치를 이동
    if (flag) {
        x = nx;
        y = ny;
    }
}

 

마지막으로 answer 정답 배열에 최종 x 좌표와 y 좌표를 대입하여 리턴해주면 끝입니다.

 

    answer[0] = x;
    answer[1] = y;
    return answer;

 

전체 코드

import java.util.*;
class Solution {
    public int[] solution(String[] park, String[] routes) {
        int[] answer = new int[2];
        int[] dx = {-1, 0, 1, 0};
        int[] dy = {0, 1, 0, -1};
        int direction = 0;
        int height = park.length;
        int weight = park[0].length();
        int x = 0, y = 0;

        //로봇 위치 찾기
        for(int i = 0; i < park.length; i++) {
            if(park[i].contains("S")) {
                x = i;
                y = park[i].indexOf("S");
            }
        }

        for(int i = 0; i < routes.length; i++) {
            switch(routes[i].split(" ")[0]) {
                case "E" :
                    direction = 1;
                    break;
                case "S" :
                    direction = 2;
                    break;
                case "W" :
                    direction = 3;
                    break;
                case "N" :
                    direction = 0;
                    break;
            }

            int moveCount = Integer.parseInt(routes[i].split(" ")[1]);
            int nx = x;
            int ny = y;
            boolean flag = true;
            for(int j = 0; j < moveCount; j++) {
                nx += dx[direction];
                ny += dy[direction];
                if(nx < 0 || nx >= height || ny < 0 || ny >= weight || park[nx].charAt(ny) == 'X') {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                x = nx;
                y = ny;
            }
        }
        answer[0] = x;
        answer[1] = y;
        return answer;
    }
}

 

'Algorithm' 카테고리의 다른 글

[프로그래머스 레벨 1] 바탕화면 정리  (1) 2024.02.09