알고리즘 문제

프로그래머스 (Java) 공원 산책

정리제이 2024. 8. 7. 10:05

문제 이름:

공원 산책

 

문제 설명:

지나다니는 길을 'O', 장애물을 'X'로 나타낸 직사각형 격자 모양의 공원에서 로봇 강아지가 산책을 하려합니다. 
산책은 로봇 강아지에 미리 입력된 명령에 따라 진행하며, 명령은 다음과 같은 형식으로 주어집니다.

["방향 거리", "방향 거리" … ]
예를 들어 "E 5"는 로봇 강아지가 현재 위치에서 동쪽으로 5칸 이동했다는 의미입니다. 
로봇 강아지는 명령을 수행하기 전에 다음 두 가지를 먼저 확인합니다.

주어진 방향으로 이동할 때 공원을 벗어나는지 확인합니다.
주어진 방향으로 이동 중 장애물을 만나는지 확인합니다.
위 두 가지중 어느 하나라도 해당된다면, 로봇 강아지는 해당 명령을 무시하고 다음 명령을 수행합니다.
공원의 가로 길이가 W, 세로 길이가 H라고 할 때, 공원의 좌측 상단의 좌표는 (0, 0), 우측 하단의 좌표는 (H - 1, W - 1) 입니다.

 

공원을 나타내는 문자열 배열 park, 로봇 강아지가 수행할 명령이 담긴 문자열 배열 routes가 매개변수로 주어질 때, 

로봇 강아지가 모든 명령을 수행 후 놓인 위치를 [세로 방향 좌표, 가로 방향 좌표] 순으로 배열에 담아 

return 하도록 solution 함수를 완성해주세요.

 

코드:

class Solution {
    public int[] solution(String[] park, String[] routes) {
        
        int x = 0, y = 0;
        for(int i = 0; i < park.length; i++){
            for(int j = 0; j < park[0].length(); j++){
                if(park[i].charAt(j) == 'S'){
                    x = i;   //시작지점
                    y = j;
                    break;
                }
            }
        }
        
        
        for(String ro : routes){   
            String[] str = ro.split(" ");
            String di = str[0];
            int n = Integer.parseInt(str[1]);
            
            
            int dx = 0, dy = 0; // 해당 방향으로 이동
            switch(di){
                    case "N" -> dx--;
                    case "S" -> dx++;
                    case "E" -> dy++;
                    case "W" -> dy--;
            }
            
            boolean flag = true;
            for(int i = 1; i <= n; i++){
                int nx = x + dx * i;
                int ny = y + dy * i;
           // 시작지점 + 방향 관련 한 번 이동 * 총 이동거리; E 2 : park[0].charAt(1), park[0].charAt(2)를 비교
                if(nx < 0 || nx >= park.length || 
                   ny < 0 || ny >= park[0].length() || 
                   park[nx].charAt(ny) == 'X'){
                    flag = false;
                    break;
                }
            }
            
            if(flag){
             x += dx * n;
             y += dy * n;
            }
            
        }
    
         
        return new int[]{x,y};
    }
}

 

 


int x = 0, y = 0;
        for(int i = 0; i < park.length; i++){
            for(int j = 0; j < park[0].length(); j++){
                if(park[i].charAt(j) == 'S'){
                    x = i;   //시작지점
                    y = j;
                    break;
                }
            }
        }

 

 

공원의 시작지점이 다르기 때문에 시작지점을 먼저 초기화 해준다

공원의 총 길이를 먼저 반복문으로 돌리고 그 반복문안에 공원의 각 값의 길이만큼 돌려서 하나씩 차례대로 S를 찾는다.

S가 있으면 그 자리를 X ,Y 에다가 저장해준다. 저장이 되면 더 이상 진행을 안 해도 되기 때문에 break로 멈춘다


for(String ro : routes){   
            String[] str = ro.split(" ");
            String di = str[0];
            int n = Integer.parseInt(str[1]);
            
            
            int dx = 0, dy = 0; // 해당 방향으로 이동
            switch(di){
                    case "N" -> dx--;
                    case "S" -> dx++;
                    case "E" -> dy++;
                    case "W" -> dy--;
            }

 

방향을 알아야 하기 때문에 routes의 값을 하나씩 가져와서 그 값을 split을 사용해서

공백을 기준으로 잘라서 배열에 담아준다.

배열의 담긴 값 중 방향을 나타내는 값과 이동거리를 나타내는 값을 따로 빼서 저장해준다.

방향이 담긴 변수를 switch문을 통해서 방향에 맞게 이동을 시켜준다.


boolean flag = true;
            for(int i = 1; i <= n; i++){
                int nx = x + dx * i;
                int ny = y + dy * i;
           // 시작지점 + 방향 관련 한 번 이동 * 총 이동거리; E 2 : park[0].charAt(1), park[0].charAt(2)를 비교
                if(nx < 0 || nx >= park.length || 
                   ny < 0 || ny >= park[0].length() || 
                   park[nx].charAt(ny) == 'X'){
                    flag = false;
                    break;
                }
            }

 

이제 총 이동거리와 공원의 장애물이 있는지 없는지 공원을 벗어나는지를 확인을 해줘야 한다.

반복문을 통해서 1부터 총 이동거리까지 반복을하고 시작지점에서 한 칸씩 이동하면서

장애물과 공원을 벗어나는지를 확인한다.

장애물을 만나거나 공원을 벗어나면 flag를 false로 바꾸고 반복문을 종료시킨다.

flag는 정상적으로 이동을 했을 때 더해주기 위한 조건문을 사용하기 위해 사용함


	if(flag){
             x += dx * n;
             y += dy * n;
            }

 

장애물을 만나지 않거나 공원을 안 벗어나면 정상적으로 이동이 된 것이기 때문에 

이동한 거리만큼 X,Y에 더해줘야한다.