로봇 강아지가 공원에서 주어진 명령을 따라 이동하는 문제를 해결하기 위해 다음과 같은 단계를 수행한다.
- 공원 정보 처리
- park 배열을 순회하여 각 위치를 확인하고, 시작점(‘S’)의 좌표를 찾는다.
- 공원의 각 위치를 2차원 배열이나 리스트로 표현하여 이동 가능 여부(지나다닐 수 있는 길 ‘O’ 또는 장애물 ‘X’)를 표시한다.
- 명령 분해 및 방향 설정
- routes 배열의 각 명령을 순회하면서 문자열을 방향과 거리로 분리한다.
- 방향에 따라 좌표 변화량을 설정한다:
- 동쪽(E): x 증가 (+1)
- 서쪽(W): x 감소 (-1)
- 남쪽(S): y 증가 (+1)
- 북쪽(N): y 감소 (-1)
- 이동 가능 여부 확인 및 위치 업데이트
- 명령에 따른 이동 경로를 한 칸씩 확인하면서 다음을 검사한다:
- 공원의 범위를 벗어나는지 확인합니다. 좌표가 음수이거나 공원의 크기를 초과하면 범위를 벗어난 것.
- 이동 경로 중에 장애물(‘X’)이 있는지 확인한다.
- 위 조건 중 하나라도 만족하면 해당 명령은 무시하고 다음 명령으로 넘어간다.
- 모든 조건을 만족하면 로봇 강아지의 현재 위치를 명령에 따른 위치로 업데이트한다.
- 최종 위치 반환
- 모든 명령을 수행한 후 로봇 강아지의 최종 위치를 [세로 좌표(y), 가로 좌표(x)] 형태의 배열로 반환한다.
public class ParkWalk {
public int[] solution(String[] park, String[] routes) {
int height = park.length, width = park[0].length();
boolean[][] map = new boolean[height][width];
int x = 0, y = 0;
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
char cell = park[i].charAt(j);
map[i][j] = (cell != 'X');
if (cell == 'S') {
x = j;
y = i;
}
}
}
for (String route : routes) {
String[] parts = route.split(" ");
String direction = parts[0];
Integer distance = Integer.parseInt(parts[1]);
int sx = x, sy = y;
for (int i = 0; i < distance; i++) {
if (direction.equals("E")) sx++;
if (direction.equals("W")) sx--;
if (direction.equals("N")) sy--;
if (direction.equals("S")) sy++;
if (sx < 0 || sx >= width || sy < 0 || sy >= height || !map[sy][sx]) {
sx = x;
sy = y;
break;
}
}
x = sx;
y = sy;
}
return new int[]{y, x};
}
}