청소로봇이 방을 청소하려고 합니다. 방은 n*n 격자판 지도로 표현됩니다.
방에는 장애물이 있고, 장애물이 있는 지점은 로봇이 지나갈 수 없습니다.
로봇은 지도의 왼쪽 가장 위 격자에서 3시 방향(오른쪽)을 보고 있습니다.
로봇이 한 격자를 이동하는데 걸리는 시간은 1초입니다.
로봇은 매초 한 칸씩 보고 있는 방향으로 이동합니다. 만약 지도 끝으로 이동해 더 이상 전진
할 수 없거나 또는 장애물을 만나면 제자리에서 시계방향으로 90도 회전합니다. 회전하는데도
1초의 시간이 필요합니다.
매개변수 board에 방의 지도정보가 주어지고, k에 초시간이 주어지면 로봇이 움직이기 시작해
서 k초 후에 멈춥니다. k초 후 로봇의 위치를 반환하는 프로그램을 작성하세요.
입출력 예:
| board | k | answer |
|---|---|---|
| [ [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] ] | 10 | [2, 2] |
| [ [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] ] | 20 | [4, 5] |
| [ [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] ] | 25 | [0, 1] |
문제에 나와있는대로 풀이하면 되는 문제일 듯 하다.
바라보는 방향에 따라 잘 이동시키는게 중요할 듯 하다.
class Solution {
char[] direction = {'R', 'D', 'L', 'U'};
public int[] solution(int[][] board, int k){
int[] answer = new int[2];
int length = board[0].length;
int row = 0, col = 0, idx = 0;
// 주어진 k 만큼 이동시키기
for (int i = 0; i < k; i++) {
//장애물이거나 이동할 수 없는 위치면 방향 바꾸기
if (direction[idx] == 'R') {
int nextCol = col + 1;
if (nextCol == length || board[row][nextCol] == 1) {
idx++;
} else {
col = nextCol;
}
} else if (direction[idx] == 'D') {
int nextRow = row + 1;
if (nextRow == length || board[nextRow][col] == 1) {
idx++;
} else {
row = nextRow;
}
} else if (direction[idx] == 'L') {
int nextCol = col - 1;
if (nextCol < 0 || board[row][nextCol] == 1) {
idx++;
} else {
col = nextCol;
}
} else if (direction[idx] == 'U') {
int nextRow = row - 1;
if (nextRow < 0 || board[nextRow][col] == 1) {
idx = 0;
} else {
row = nextRow;
}
}
}
answer[0] = row;
answer[1] = col;
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)));
}
}
동서남북을 좌표 배열로 두고 그 좌표의 인덱스를 방향으로 두게끔하면 좀 더 효율적으로 풀 수 있는 문제였다.