n*n 격자판의 방에 청소기 로봇이 활동합니다. 방에는 로봇이 지나갈 수 없는 장애물이 있습니다. 로봇은 왼쪽 상단에서 시작하여 오른쪽을 향하며, 한 칸 이동하는데 1초가 필요합니다. 방의 경계나 장애물을 만나면 시계방향으로 90도 회전하고, 회전하는데도 1초가 걸립니다.
제한사항
• board의 크기 (3 <= n <= 100)
• board에서 0은 빈 공간이고, 1은 장애물이다.
• board에서 로봇의 시작위치는 0행 0열(가장 왼쪽 가장 위)이다.
• 변수 k는 1,000이하의 자연수이다
import java.util.*;
class Solution {
public int[] solution(int[][] board, int k){
int direction = 0;
int []answer = new int[2];
int n=board.length;
for (int i = 0; i < k; i++) {
if(direction==0){
if(answer[1]==n-1) {
direction=1;
continue;
} else if (board[answer[0]][answer[1]+1]==1) {
direction=1;
continue;
} else
answer[1]+=1;
} else if (direction==1) {
if( answer[0]==n-1 ) {
direction=2;
continue;
} else if (board[answer[0]+1][answer[1]]==1) {
direction=2;
continue;
} else
answer[0]+=1;
} else if (direction==2) {
if(answer[1]==0) {
direction=3;
continue;
} else if (board[answer[0]][answer[1]-1]==1) {
direction=3;
continue;
} else
answer[1]-=1;
} else if (direction==3) {
if( answer[0]==0) {
direction=0;
continue;
} else if (board[answer[0]-1][answer[1]]==1) {
direction=0;
continue;
} else
answer[0]-=1;
}
}
return answer;
}
public static void main(String[] args){
Solution T = new Solution();
int[][] arr1 = {{0, 0, 0, 0, 0},
{0, 1, 1, 0, 0},
{0, 0, 0, 0, 0},
{1, 0, 1, 0, 1},
{0, 0, 0, 0, 0}};
System.out.println(Arrays.toString(T.solution(arr1, 10)));
int[][] arr2 = {{0, 0, 0, 1, 0, 1},
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 1},
{1, 1, 0, 0, 1, 0},
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}};
System.out.println(Arrays.toString(T.solution(arr2, 20)));
int[][] arr3 = {{0, 0, 1, 0, 0},
{0, 1, 0, 0, 0},
{0, 0, 0, 0, 0},
{1, 0, 0, 0, 1},
{0, 0, 0, 0, 0}};
System.out.println(Arrays.toString(T.solution(arr3, 25)));
}
}
핵심 로직
방향에 따른 위치 이동을 배열로 생성해서 지정
int[] dx = {-1, 0, 1, 0};
int[] dy = {0, 1, 0, -1};
while( k번 반복 )
현재 위치 x,y에 dx와 dy를 더한다.
더한 x,y가 0이하이거나, 최대값 n과 동일 혹은 board 값이 1이면 ( 장애물이 있으면 )
방향을 바꾼다 ( d = (d + 1) % 4; )
그 외의 경우에는 x,y에 더한 값을 저장하고 다음 반복으로 간다.