프로그래머스

[프로그래머스_Level1] 공원 산책

빙수빈수 2023. 4. 25. 14:27

[문제]

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

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

 

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

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

 

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

 

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

 

[제한 조건]

  • 3 ≤ park의 길이 ≤ 50
    • 3 ≤ park[i]의 길이 ≤ 50
      • park[i]는 다음 문자들로 이루어져 있으며 시작지점은 하나만 주어집니다.
        • S : 시작 지점
        • O : 이동 가능한 통로
        • X : 장애물
    • park는 직사각형 모양입니다.

 

  • 1 ≤ routes의 길이 ≤ 50
    • routes의 각 원소는 로봇 강아지가 수행할 명령어를 나타냅니다.
    • 로봇 강아지는 routes의 첫 번째 원소부터 순서대로 명령을 수행합니다.
    • routes의 원소는 "op n"과 같은 구조로 이루어져 있으며, op는 이동할 방향, n은 이동할 칸의 수를 의미합니다.
      • op는 다음 네 가지중 하나로 이루어져 있습니다.
        • N : 북쪽으로 주어진 칸만큼 이동합니다.
        • S : 남쪽으로 주어진 칸만큼 이동합니다.
        • W : 서쪽으로 주어진 칸만큼 이동합니다.
        • E : 동쪽으로 주어진 칸만큼 이동합니다.
      • 1 ≤ n ≤ 9

 

[코드]

public int[] solution(String[] park, String[] routes) {
        int[] answer=new int[2];
        int x=0,y=0;
        char[][] map=new char[park.length][park[0].length()];
        
        // 맵을 2차원으로 변경, 시작 지점 저장
        for(int i=0;i<park.length;i++) {
        	String str=park[i];
        	for(int j=0;j<park[i].length();j++) {
        		if(str.charAt(j)=='S') { // 시작 지점 저장
        			x=i;
        			y=j;
        		}
        		map[i][j]=str.charAt(j);
        	}
        }
        
        // 명령 수행
        for(int i=0;i<routes.length;i++) {
        	char dir=routes[i].charAt(0); // 방향
        	int count=routes[i].charAt(2)-48; // 이동 칸수
        	
        	int nx=x;
        	int ny=y;
        	boolean check=false; // 해당 명령을 무시해야 하는지 체크하는 변수
        	
        	for(int j=0;j<count;j++) {
        		if(dir=='N') // 북
        			nx-=1;
        		else if(dir=='S') // 남
        			nx+=1;
        		else if(dir=='W') // 서
        			ny-=1;
        		else // 동
        			ny+=1;
        		
        		// 이동할때 맵을 벗어나거나 장애물을 만나면 해당 명령 무시
        		if(nx<0||ny<0||nx>=map.length||ny>=map[0].length||map[nx][ny]=='X') {
        			check=true; // check 값 변경
        			break;
        		}
        			
        	}
        	if(!check) { // check 값이 false인 경우에만 위치 갱신
        		x=nx;
        		y=ny;
        		check=false;
        	}
        	
        }
        
        answer[0]=x;
        answer[1]=y;
        return answer;
    }

 

[고찰]

 이번 문제에서 가장 시간이 걸렸던 부분은 장애물을 만나는 경우였다.  처음에는 count 만큼 모두 이동한 후 장애물이 있는 칸인지 확인했는데 오답 처리를 받았다. 문제를 제대로 읽어보니 dir 방향으로 count 만큼 이동하는 과정에서 장애물을 만나면 즉시 해당 명령을 무시해야 했다. 이 부분은 boolean 값을 갖는 변수로 해결하였다.