▼ What ?
이번엔 구현 - 시뮬레이션 유형의 문제를 풀어보려고 한다.
▼ 잃어버린 강아지
문제 정보
현수는 농사지을 땅을 찾아 강아지를 데리고 산으로 들로 땅을 찾아 다니고 있었다.
숲속에서 낮잠을 자던 현수는 강아지가 도망가버려 강아지를 잃게 되었다.
강아지가 어디로 갔는지 모르는 현수는 강아지를 찾아 나섰다.
다행히 강아지에게 위치 추적기가 달려 있어 핸드폰 실시 간 위성지도로 현수의 위치와 강아지의 위치, 그리고 근처의 지도를 현수는 알 수 있습니다.
지도의 크기는 항상 10*10이며, 각각의 칸에는 각각 나무, 빈칸, 강아지, 그리고 현수가 있을 수 있습니다.
지도는 다음과 같이 주어진다.
- 0 - 빈칸, 1 - 나무, 2 - 현수, 3 - 강아지 강아지와 현수는 항상 고정된 방법으로 지도를 다닌다.
- 먼저 북쪽(지도에서 위쪽)으로 출발하 되, 계속 한쪽방향으로 가다가 나무나 지도의 끝에 이르면 90도 시계방향으로 회전하게 된다. 한 칸을 이동하거나, 방향을 회전할 때에는 1분이 소요된다.
- 만약 이동, 또는 회전을 한 후 현수와 강아지가 같은 칸에 있게 되면 현수가 강아지를 찾게 된다.
현수와 강아지가 있는 숲의 지도정보가 board에 주어지면 몇 분 후에 현수가 강아지를 찾 을 수 있는지 구하는 프로그램을 작성하세요. 10,000분 후에도 찾을 수 없으면 0을 반환합니다.
입출력 예

어떻게 해결해야 할까 ?
- 먼저 2차원 배열로 주어진 board를 탐색해서 현수 위치와 강아지 위치를 찾아서 따로 저장해준다
- 전에 시뮬레이션 문제를 풀 때 방향 배열을 미리 만들어서 개체의 위치를 이동시킨 방식을 활용해서, 현수와 강아지 위치를 반복문을 통해 이동시켜준다면 큰 문제없이 해결할 수 있을 것 같다
- 단, 각 개체(현수, 강아지)가 장애물을 만났을 때 방향을 바꿔주는 것만 신경 써주자
- 개체의 이동을 수행하는 반복문은 시간이 10000분을 넘어가거나 현수와 강아지가 만나는 경우에 for문이 종료되도록 한다
해결 코드
public class Solution {
public int solution(int[][] board) {
int[] dx = {-1, 0, 1, 0};
int[] dy = {0, 1, 0, -1};
int[] hPos = new int[2]; // 현수 위치
int[] dPos = new int[2]; // 강아지 위치
for(int row = 0; row < board.length; row++) {
for(int col = 0; col < board[row].length; col++) {
if(board[row][col] == 2) {
hPos[0] = row; hPos[1] = col;
} else if(board[row][col] == 3) {
dPos[0] = row; dPos[1] = col;
}
}
}
int hDir = 0, dDir = 0;
int time = 0;
while(time <= 10000 ) {
time++;
int hTmpX = hPos[0] + dx[hDir], hTmpY = hPos[1] + dy[hDir];
int dTmpX = dPos[0] + dx[dDir], dTmpY = dPos[1] + dy[dDir];
// 현수
if(hTmpX < 0 || hTmpX >= 10 || hTmpY < 0 || hTmpY >= 10 || board[hTmpX][hTmpY] == 1) {
hDir = (hDir + 1) % 4;
} else {
hPos[0] = hTmpX; hPos[1] = hTmpY;
}
// 강아지
if(dTmpX < 0 || dTmpX >= 10 || dTmpY < 0 || dTmpY >= 10 || board[dTmpX][dTmpY] == 1) {
dDir = (dDir + 1) % 4;
} else {
dPos[0] = dTmpX; dPos[1] = dTmpY;
}
if(Arrays.equals(hPos, dPos)) break;
}
if(time == 10001) time = 0;
int answer = time;
return answer;
}
}
▼ 정리
- 일차원 배열을 비교할 때엔 'Arrays.equals()'를, 다차원 배열을 비교할 때엔 'Arrays.deepEquals()'를 사용해야 한다는사실을 잊지 말자
▼ What ?
이번엔 구현 - 시뮬레이션 유형의 문제를 풀어보려고 한다.
▼ 잃어버린 강아지
문제 정보
현수는 농사지을 땅을 찾아 강아지를 데리고 산으로 들로 땅을 찾아 다니고 있었다.
숲속에서 낮잠을 자던 현수는 강아지가 도망가버려 강아지를 잃게 되었다.
강아지가 어디로 갔는지 모르는 현수는 강아지를 찾아 나섰다.
다행히 강아지에게 위치 추적기가 달려 있어 핸드폰 실시 간 위성지도로 현수의 위치와 강아지의 위치, 그리고 근처의 지도를 현수는 알 수 있습니다.
지도의 크기는 항상 10*10이며, 각각의 칸에는 각각 나무, 빈칸, 강아지, 그리고 현수가 있을 수 있습니다.
지도는 다음과 같이 주어진다.
- 0 - 빈칸, 1 - 나무, 2 - 현수, 3 - 강아지 강아지와 현수는 항상 고정된 방법으로 지도를 다닌다.
- 먼저 북쪽(지도에서 위쪽)으로 출발하 되, 계속 한쪽방향으로 가다가 나무나 지도의 끝에 이르면 90도 시계방향으로 회전하게 된다. 한 칸을 이동하거나, 방향을 회전할 때에는 1분이 소요된다.
- 만약 이동, 또는 회전을 한 후 현수와 강아지가 같은 칸에 있게 되면 현수가 강아지를 찾게 된다.
현수와 강아지가 있는 숲의 지도정보가 board에 주어지면 몇 분 후에 현수가 강아지를 찾 을 수 있는지 구하는 프로그램을 작성하세요. 10,000분 후에도 찾을 수 없으면 0을 반환합니다.
입출력 예

어떻게 해결해야 할까 ?
- 먼저 2차원 배열로 주어진 board를 탐색해서 현수 위치와 강아지 위치를 찾아서 따로 저장해준다
- 전에 시뮬레이션 문제를 풀 때 방향 배열을 미리 만들어서 개체의 위치를 이동시킨 방식을 활용해서, 현수와 강아지 위치를 반복문을 통해 이동시켜준다면 큰 문제없이 해결할 수 있을 것 같다
- 단, 각 개체(현수, 강아지)가 장애물을 만났을 때 방향을 바꿔주는 것만 신경 써주자
- 개체의 이동을 수행하는 반복문은 시간이 10000분을 넘어가거나 현수와 강아지가 만나는 경우에 for문이 종료되도록 한다
해결 코드
public class Solution {
public int solution(int[][] board) {
int[] dx = {-1, 0, 1, 0};
int[] dy = {0, 1, 0, -1};
int[] hPos = new int[2]; // 현수 위치
int[] dPos = new int[2]; // 강아지 위치
for(int row = 0; row < board.length; row++) {
for(int col = 0; col < board[row].length; col++) {
if(board[row][col] == 2) {
hPos[0] = row; hPos[1] = col;
} else if(board[row][col] == 3) {
dPos[0] = row; dPos[1] = col;
}
}
}
int hDir = 0, dDir = 0;
int time = 0;
while(time <= 10000 ) {
time++;
int hTmpX = hPos[0] + dx[hDir], hTmpY = hPos[1] + dy[hDir];
int dTmpX = dPos[0] + dx[dDir], dTmpY = dPos[1] + dy[dDir];
// 현수
if(hTmpX < 0 || hTmpX >= 10 || hTmpY < 0 || hTmpY >= 10 || board[hTmpX][hTmpY] == 1) {
hDir = (hDir + 1) % 4;
} else {
hPos[0] = hTmpX; hPos[1] = hTmpY;
}
// 강아지
if(dTmpX < 0 || dTmpX >= 10 || dTmpY < 0 || dTmpY >= 10 || board[dTmpX][dTmpY] == 1) {
dDir = (dDir + 1) % 4;
} else {
dPos[0] = dTmpX; dPos[1] = dTmpY;
}
if(Arrays.equals(hPos, dPos)) break;
}
if(time == 10001) time = 0;
int answer = time;
return answer;
}
}
▼ 정리
- 일차원 배열을 비교할 때엔 'Arrays.equals()'를, 다차원 배열을 비교할 때엔 'Arrays.deepEquals()'를 사용해야 한다는사실을 잊지 말자