사람은 강아지와 함께 산삼을 찾아 다닌다. 하지만 숲에서 낮잠을 자는 동안 강아지를 잃어버렸다. 강아지에는 위치 추적기가 달려 있어 핸드폰으로 사람과 강아지의 위치를 알 수 있다. 지도는 10x10 크기로, 각 칸에는 빈공간(0), 장애물(1), 사람(2), 강아지(3)가 있다. 강아지와 사람은 북쪽으로 출발해 장애물이나 지도 끝에 도달하면 90도 시계 방향으로 회전한다. 칸을 이동하거나 방향을 바꿀 때마다 1분이 걸린다. 사람이 강아지를 만나면 강아지를 찾은 것이다. 지도 정보가 주어졌을 때, 사람이 강아지를 몇 분 안에 찾을 수 있는지를 계산하는 프로그램을 작성하라. 10,000분이 지나도 찾지 못하면 0을 반환한다.
class Dog {
public int solution(int[][] board){
int[] answer = new int[2];
int dogLocation[] = new int[2];
int humanLocation[] = new int[2];
for (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++) {
if(board[i][j]==2) {
humanLocation[0] = i;
humanLocation[1] = j;
} else if (board[i][j]==3) {
dogLocation[0] = i;
dogLocation[1]=j;
}
}
if(findDog(dogLocation, humanLocation))
return 0;
int n = 10;
int[] dx = {-1, 0, 1, 0};
int[] dy = {0, 1, 0, -1};
int x = 0, y = 0, d1 = 0,d2=0, count = 0;
while( !findDog(dogLocation,humanLocation) || count>=10000 ){
int nx1 = dogLocation[0] + dx[d1];
int ny1 = dogLocation[1] + dy[d1];
if(nx1 < 0 || nx1 >= n || ny1 < 0 || ny1 >= n || board[nx1][ny1] == 1){
d1 = (d1 + 1) % 4;
}
else {
dogLocation[0] = nx1;
dogLocation[1] = ny1;
}
int nx2 = humanLocation[0] + dx[d2];
int ny2 = humanLocation[1] + dy[d2];
if(nx2 < 0 || nx2 >= n || ny2 < 0 || ny2 >= n || board[nx2][ny2] == 1){
d2 = (d2 + 1) % 4;
}
else {
humanLocation[0] = nx2;
humanLocation[1] = ny2;
}
count++;
}
return count;
}
private static boolean findDog(int[] dogLocation, int[] humanLocation) {
return dogLocation[0] == humanLocation[0] && dogLocation[1] == humanLocation[1];
}