Coding Test/프로그래머스

[프로그래머스] Lv.1 공원산책 (java)

CSEGR 2024. 5. 7. 12:45
728x90

 

문제 

 

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

  • ["방향 거리", "방향 거리" … ]

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

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

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

 

공원을 나타내는 문자열 배열 park, 로봇 강아지가 수행할 명령이 담긴 문자열 배열 routes가 매개변수로 주어질 때, 로봇 강아지가 모든 명령을 수행 후 놓인 위치를 [세로 방향 좌표, 가로 방향 좌표] 순으로 배열에 담아 return 하도록 solution 함수를 완성해주세요.

 

제한사항

  • 3 ≤ park의 길이 ≤ 50
  • 1 ≤ routes의 길이 ≤ 50

입출력 예

park routes result
["SOO","OOO","OOO"] ["E 2","S 2","W 1"] [2,1]
["SOO","OXX","OOO"] ["E 2","S 2","W 1"] [0,1]
["OSO","OOO","OXO","OOO"] ["E 2","S 3","W 1"] [0,0]

입출력 예 설명

입출력 예 #1

입력된 명령대로 동쪽으로 2칸, 남쪽으로 2칸, 서쪽으로 1칸 이동하면 [0,0] -> [0,2] -> [2,2] -> [2,1]이 됩니다.

입출력 예 #2

입력된 명령대로라면 동쪽으로 2칸, 남쪽으로 2칸, 서쪽으로 1칸 이동해야하지만 남쪽으로 2칸 이동할 때 장애물이 있는 칸을 지나기 때문에 해당 명령을 제외한 명령들만 따릅니다. 결과적으로는 [0,0] -> [0,2] -> [0,1]이 됩니다.

입출력 예 #3

처음 입력된 명령은 공원을 나가게 되고 번째로 입력된 명령 또한 장애물을 지나가게 되므로 입력은 제외한 번째 명령만 따르므로 결과는 다음과 같습니다. [0,1] -> [0,0]

전체 코드
class Solution {
    public int[] solution(String[] park, String[] routes) {
        
        int x = 0;
        int y = 0;
        
        //시작점 찾기
        for(int i = 0; i<park.length; i++)
        {
            if(park[i].contains("S")){
                y = park[i].indexOf("S");
                x = i;
                
                break;
            }
        }
       
       for(String route : routes){
            int x_move = x;
            int y_move = y;
            String[] route_char = route.split(" ");
            int route_num = Integer.parseInt(route_char[1]);
            
            for(int j =0; j< route_num; j++)
            {
                if(route_char[0].equals("E")) y_move++;
                else if(route_char[0].equals("W")) y_move--;
                else if(route_char[0].equals("N")) x_move--;
                else if(route_char[0].equals("S")) x_move++;
                
                if(x_move>-1 && y_move>-1 && x_move<park.length && y_move<park[0].length()){
                    if(park[x_move].charAt(y_move)== 'X')
                    {
                        System.out.println("hahahhha");
                        break;
                    }
                    if(j == route_num-1)
                    {
                        x = x_move;
                        y = y_move;
                    }
                }
            }

        }
        int[] answer = {x,y};
        return answer;
    }
}

 

 

코드 설명

 

1.

1) 로봇강아지의 위치를 저장할 x,y 변수를 선언

2) 시작점을 찾아서 x,y 변수에 넣기

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

2. 이동 로직 

	//routes에 담긴 요소 만큼 반복문. 
    for(String route : routes){
    
    		//장애물 및 park를 벗어나는 경우를 대비해서 
            //x,y좌표 유효성 검사를 위한 변수 x_move, y_move 선언 
            int x_move = x;
            int y_move = y;
            
            // route(["E 2","S 2","W 1"])에서
            //방향과 이동할 칸 수를 저장할 route_char 배열 선언
            String[] route_char = route.split(" ");
            
            //이동할 칸 수가 String이므로 int형으로 변환
            int route_num = Integer.parseInt(route_char[1]);
            
            //이동할 칸 수 만큼 반복문 
            for(int j =0; j< route_num; j++)
            {
            	//방향이 "E"일 경우 y좌표가 늘어남. 
                //방향이 "W"일 경우 y좌표가 줄어듦. 
                //방향이 "N"일 경우 x좌표가 줄어듦. 
                //방향이 "S"일 경우 y좌표가 늘어남. 
                if(route_char[0].equals("E")) y_move++;
                else if(route_char[0].equals("W")) y_move--;
                else if(route_char[0].equals("N")) x_move--;
                else if(route_char[0].equals("S")) x_move++;
                
                //(x_move,y_move)가 park를 벗어날 경우는 무시 
                if(x_move>-1 && y_move>-1 && x_move<park.length && y_move<park[0].length()){
                    
                    //park 장애물에 걸리는 경우에는 다음 칸으로 이동을 하지 않아도 
                    //이동이 어차피 안된다. => 이동 무시. 
                    if(park[x_move].charAt(y_move)== 'X')
                    {
                        break;
                    }
                    
                    //j가 route_num-1 인 경우 
                    // = park 안에 있다 & 장애물에 걸리지 않는 경우 
                    // 즉, 유효한 이동이므로 이동 !!!
                    if(j == route_num-1)
                    {
                        x = x_move;
                        y = y_move;
                    }
                }
            }

        }
배열 반환

좌표 x,y 를 return 한다. 

	int[] answer = {x,y};
        return answer;

 

 

결과

 

p.s) 그렇게 복잡한 문제는 아니였다.. 좌표를 헷갈리지 않고 잘 넣는다면 쉽게 풀리는 문제 !!!

728x90