백준_로봇청소기 문제
풀이 코드

다른 것 보단 생각하는 시간이 적게 걸렸다.
구현하는 데 좀 애를 먹어서 고치는 시간이 조금 걸렸던 것 같다.

처음 생각했던 것 보다 좀 더럽게 짠 것 같아서 아쉽다..

풀이

먼저 네 방향에 이미 청소가 되어있거나, 벽인지 확인했다.
그럴 경우에는 원래 방향을 유지한채로 후진해야하기 때문에 방향을 바꾸기 전에 미리 처리했다.

한 방향이라도 청소할 공간이 있으면, 일단 먼저 방향먼저 돌려준다.
청소할 공간이 있던 없던 일단 방향은 계속해서 돌리기 때문이다.
방향은 0>3, 1>0, 2>1, 3>2로 돌고 있으므로 (nDirection + 3) % 4로 계산해주었다.

방향을 돌린 후에는 전진 방향이 청소되어있는지 확인한다.
만약 청소가 되어있지 않으면 전진하고, 전진하면 맵에 청소 완료 표시로 -1을 입력하고 CleaningCnt를 증가시킨다.
만약 청소가 되어있다면 계속해서 방향을 돌려서 청소가 되지 않은 부분으로 이동한다.

이렇게 계속해서 돌다가 네 방향이 이미 청소가 되어있고, 후진했을 때 벽이 나오면 프로그램이 정지하도록 했다.

아래 그림은 예제 입력 2의 청소기 이동 경로이다.
디버깅하면서 에러를 체크하는 데 많은 도움이 됐다. 참고가 되었으면 좋겠다 :)

example2

import java.util.Scanner;

public class Main {
   static int[][] maps;
   static int nCleaningCnt = 0;
   static int[] ny = {+1, -1, 0, 0};
   static int[] nx = {0, 0, -1, +1};
   
	public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      
      int nRow = sc.nextInt();
      int nCol = sc.nextInt();
      
      maps = new int[nRow][nCol];
      
      int[] robotLoc = new int[2];
      
      robotLoc[0] = sc.nextInt();
      robotLoc[1] = sc.nextInt();
      
      int nDirection = sc.nextInt();
      
      for(int i = 0; i < nRow; i++) {
    	  for(int j = 0; j < nCol; j++) {
    		  maps[i][j] = sc.nextInt();
    	  }
      }
      
      maps[robotLoc[0]][robotLoc[1]] = -1;
      nCleaningCnt++;
      
      cleaning(robotLoc, nDirection);
      
      System.out.println(nCleaningCnt);
   }
	public static void cleaning(int[] robotLoc, int nDirection) {
		int nClean = 0; 
		
		while(true) {
			nClean = 0;
			 
			for(int i = 0; i < 4; i++) {
				int y = robotLoc[0] + ny[i];
				int x = robotLoc[1] + nx[i];
				
				if(y >= 0 && y < maps.length && x >= 0 && x < maps[0].length) {
					if(maps[y][x] == 1 || maps[y][x] == -1)
						nClean++;
				}
			}
			
			if(nClean == 4) {
				//동 <> 서, 북 <> 남 (후진)
				if(nDirection - 2 < 0) {
					nDirection += 2;
				}else nDirection -= 2;
				
				robotMoveBack(robotLoc, nDirection);
				
				//원래 방향으로 바꿈
				if(nDirection - 2 < 0) {
					nDirection += 2;
				}else nDirection -= 2;
				
				if(maps[robotLoc[0]][robotLoc[1]] == 1) break;
			 }else {
				 nDirection = (nDirection + 3) % 4;
				 robotMove(robotLoc, nDirection);
			 
				 if (maps[robotLoc[0]][robotLoc[1]] == 0) {
					 maps[robotLoc[0]][robotLoc[1]] = -1;
					 nCleaningCnt++;
				 }
			 }
		}
	}
	public static void robotMove(int[] robotLoc, int nDirection) {
		switch(nDirection) {
		 case 0:
			 if(maps[robotLoc[0] - 1][robotLoc[1]] != -1 && maps[robotLoc[0] - 1][robotLoc[1]] != 1)
				 robotLoc[0] -= 1;
			 break;
		 case 1:
			 if(maps[robotLoc[0]][robotLoc[1] + 1] != -1 && maps[robotLoc[0]][robotLoc[1] + 1] != 1)
				 robotLoc[1] += 1;
			 break;
		 case 2:
			 if(maps[robotLoc[0] + 1][robotLoc[1]] != -1 && maps[robotLoc[0] + 1][robotLoc[1]] != 1)
				 robotLoc[0] += 1;
			 break;
		 case 3:
			 if(maps[robotLoc[0]][robotLoc[1] - 1] != -1 && maps[robotLoc[0]][robotLoc[1] - 1] != 1)
				 robotLoc[1] -= 1;
			 break;
		 }
	}
	public static void robotMoveBack(int[] robotLoc, int nDirection) {
		switch(nDirection) {
		 case 0:
			 robotLoc[0] -= 1;
			 break;
		 case 1:
			 robotLoc[1] += 1;
			 break;
		 case 2:
			 robotLoc[0] += 1;
			 break;
		 case 3:
			 robotLoc[1] -= 1;
			 break;
		 }
	}
}