이번 문제의 주요 로직은 다음과 같다.
- 공원의 초기 상태 파악하기: 문자열 배열 park를 이용하여 공원의 상태를 2차원 배열 newPark에 저장한다. 이때, 산책 시작 위치도 함께 저장한다.
- 명령에 따라 이동 처리하기: 문자열 배열 routes에 담긴 각 명령을 분석하여 이동할 방향과 거리를 결정한다. 이때, move 메소드를 호출하여 실제 이동 처리를 진행한다.
- 이동 가능 여부 확인하기: move 메소드 내에서는 산책 도중 공원을 벗어나거나 장애물에 부딪히는지 확인한다. 만약 이동 중 장애물을 만나거나 공원 경계를 벗어나려고 한다면, 해당 명령을 무시하고 위치를 조정하지 않는다.
먼저 공원의 초기 설정이다.
for(int i = 0; i < park.length; i++) {
for(int j = 0; j < park[0].length(); j++) {
newPark[i][j] = park[i].charAt(j);
if(park[i].charAt(j) == 'S') {
start[0] = i;
start[1] = j;
}
}
}
공원의 각 칸을 순회하며 newPark 배열에 정보를 저장한 뒤, 산책을 처음 시작할 위치도 저장한다.
그 후 명령에 따른 이동 처리를 한다.
for(int i = 0; i < routes.length; i++) {
String direction = routes[i].split(" ")[0];
int distance = Integer.parseInt(routes[i].split(" ")[1]);
move(direction, distance);
}
각 명령을 분석하여 이동 거리와 방향을 결정한 후, move 메소드를 활용하여 움직인다.
move메소드의 이동 로직 구현
public static void move(String way, int distance, int[] start, char[][] newPark) {
switch(way) {
case "N" : int y = start[1];
if(y - distance < 0) break;
for(int i = 1; i <= distance; i++) {
y--;
if(newPark[y][start[1]] == 'X') {
y =+ i;
start[1] = y;
break;
}
start[1] = y;
}
break;
case "E" : int x = start[0];
if(x + start[0] > newPark[0].length - 1) break;
for(int i = 1; i <= distance; i++) {
x++;
if(newPark[start[1]][x] == 'X') {
x =- i;
start[0] = x;
break;
}
start[0] = x;
}
break;
case "W" : x = start[0];
if(x - distance < 0) break;
for(int i = 1; i <= distance; i++) {
x--;
if(newPark[start[1]][x] == 'X') {
x =+ i;
start[0] = x;
break;
}
start[0] = x;
}
break;
case "S" : y = start[1];
if(y + distance > newPark[0].length - 1) break;
for(int i = 1; i <= distance; i++) {
y++;
if(newPark[y][start[0]] == 'X') {
y =- i;
start[1] = y;
break;
}
start[1] = y;
}
break;
}
}
- move 메소드는 로봇 강아지의 이동을 시뮬레이션하는 핵심 부분이다. 로봇이 이동할 때마다 경계 체크와 장애물 체크를 수행하여 안전한 이동 경로를 보장한다.
- 이동 중 장애물에 부딪히거나 공원의 경계를 넘으려고 하면, 해당 명령은 무시하고 로봇의 위치를 업데이트하지 않거나 이동을 즉시 중단한다.