현수는 농사지을 땅을 찾아 강아지를 데리고 산으로 들로 땅을 찾아 다니고 있었다.
숲속에서 낮잠을 자던 현수는 강아지가 도망가버려 강아지를 잃게 되었다.
강아지가 어디로 갔는지 모르는 현수는 강아지를 찾아 나섰다.
다행히 강아지에게 위치 추적기가 달려 있어 핸드폰 실시간 위성지도로 현수의 위치와 강아지의 위치, 그리고 근처의 지도를 현수는 알 수 있습니다.
지도의 크기는 항상 10*10이며, 각각의 칸에는 각각 나무, 빈칸, 강아지, 그리고 현수가 있을
수 있습니다.
지도는 다음과 같이 주어진다.
0 - 빈칸, 1 - 나무, 2 - 현수, 3 - 강아지
강아지와 현수는 항상 고정된 방법으로 지도를 다닌다.
먼저 북쪽(지도에서 위쪽)으로 출발하되, 계속 한쪽방향으로 가다가 나무나 지도의 끝에 이르면 90도 시계방향으로 회전하게 된다.
한 칸을 이동하거나, 방향을 회전할 때에는 1분이 소요된다.
만약 이동, 또는 회전을 한 후 현수와 강아지가 같은 칸에 있게 되면 현수가 강아지를 찾게 된다.
현수와 강아지가 있는 숲의 지도정보가 board에 주어지면 몇 분 후에 현수가 강아지를 찾을 수 있는지 구하는 프로그램을 작성하세요.
10,000분 후에도 찾을 수 없으면 0을 반환합니다.
강아지와 현수 각자의 위치를 구하고 출발시키면 될 것 같다.
class Solution {
static final char[] DIRECTION = {'U', 'R', 'D', 'L'};
static final int BOARD_SIZE = 10;
static final int MAX_MINUTE = 10000;
public int solution(int[][] board){
int answer = 1;
int hsRow = 0, hsCol = 0, dogRow = 0, dogCol = 0;
// 일단 현수랑 강아지 위치부터 구하기.
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
if (board[i][j] == 2) {
hsRow = i;
hsCol = j;
}
if (board[i][j] == 3) {
dogRow = i;
dogCol = j;
}
}
}
// 이동 시작
// 0 - 빈칸, 1 - 나무, 2 - 현수, 3 - 강아지
int hsIdx = 0, dogIdx = 0;
for(; answer <= MAX_MINUTE; answer++) {
// 현수
if (DIRECTION[hsIdx] == 'U') {
int nextRow = hsRow - 1;
if (nextRow == -1 || board[nextRow][hsCol] == 1) {
hsIdx++;
} else {
hsRow = nextRow;
}
} else if (DIRECTION[hsIdx] == 'R') {
int nextCol = hsCol + 1;
if (nextCol == BOARD_SIZE || board[hsRow][nextCol] == 1) {
hsIdx++;
} else {
hsCol = nextCol;
}
} else if (DIRECTION[hsIdx] == 'D') {
int nextRow = hsRow + 1;
if (nextRow == BOARD_SIZE || board[nextRow][hsCol] == 1) {
hsIdx++;
} else {
hsRow = nextRow;
}
} else if (DIRECTION[hsIdx] == 'L') {
int nextCol = hsCol - 1;
if (nextCol == -1 || board[hsRow][nextCol] == 1) {
hsIdx = 0;
} else {
hsCol = nextCol;
}
}
// 강아지
if (DIRECTION[dogIdx] == 'U') {
int nextRow = dogRow - 1;
if (nextRow == -1 || board[nextRow][dogCol] == 1) {
dogIdx++;
} else {
dogRow = nextRow;
}
} else if (DIRECTION[dogIdx] == 'R') {
int nextCol = dogCol + 1;
if (nextCol == BOARD_SIZE || board[dogRow][nextCol] == 1) {
dogIdx++;
} else {
dogCol = nextCol;
}
} else if (DIRECTION[dogIdx] == 'D') {
int nextRow = dogRow + 1;
if (nextRow == BOARD_SIZE || board[nextRow][dogCol] == 1) {
dogIdx++;
} else {
dogRow = nextRow;
}
} else if (DIRECTION[dogIdx] == 'L') {
int nextCol = dogCol - 1;
if (nextCol == -1 || board[dogRow][nextCol] == 1) {
dogIdx = 0;
} else {
dogCol = nextCol;
}
}
if(hsRow == dogRow && hsCol == dogCol) {
break;
}
}
if (answer == 10000) return 0;
return answer;
}
public static void main(String[] args){
Solution T = new Solution();
int[][] arr1 = {{0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
{0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 2, 0, 0},
{1, 0, 0, 0, 0, 0, 1, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 3, 0, 0, 0, 1},
{0, 0, 0, 1, 0, 1, 0, 0, 0, 0},
{0, 1, 0, 1, 0, 0, 0, 0, 0, 0}};
System.out.println(T.solution(arr1));
int[][] arr2 = {{1, 0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
{0, 0, 1, 1, 0, 0, 0, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 1, 0, 0, 0, 0},
{1, 0, 0, 0, 0, 0, 1, 0, 1, 0},
{0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 0, 0, 0, 0, 2, 1},
{0, 0, 0, 1, 0, 1, 0, 0, 0, 1},
{0, 1, 0, 1, 0, 0, 0, 0, 0, 3}};
System.out.println(T.solution(arr2));
}
}
이 문제도 동서남북을 좌표로 두고 풀면 좀 더 효율적으로 풀 수 있는 문제였다.