💡 문제
💬 입출력 예시
📌 풀이(소스코드)
class Solution {
public int[] solution(String[] park, String[] routes) {
int w = park.length;
int h = park[0].length();
int[] dr = {0, 0, 1, -1};
int[] dc = {1, -1, 0, 0};
int[] pos = new int[2];
char[][] grid = new char[w][h];
for (int i = 0; i < w; i++) {
String s = park[i];
for (int j = 0; j < h; j++) {
grid[i][j] = s.charAt(j);
if (grid[i][j] == 'S') {
pos[0] = i;
pos[1] = j;
}
}
}
for (String route : routes) {
char op = route.charAt(0);
int index = getDirectionIndex(op);
int n = route.charAt(2) - '0';
int r = pos[0];
int c = pos[1];
boolean isValid = true;
for (int i = 0; i < n; i++) {
int nr = r + dr[index];
int nc = c + dc[index];
if (isNotValid(w, h, grid, nr, nc)) {
isValid = false;
break;
}
r = nr;
c = nc;
}
if (isValid) {
pos[0] = r;
pos[1] = c;
}
}
return pos;
}
private int getDirectionIndex(char op) {
if (op == 'E') {
return 0;
} else if (op == 'W') {
return 1;
} else if (op == 'S') {
return 2;
}
return 3;
}
private boolean isNotValid(int w, int h, char[][] grid, int nr, int nc) {
return nr < 0 || nc < 0 || nr >= w || nc >= h || grid[nr][nc] == 'X';
}
}
📄 해설
접근
- 방향 배열을 사용한 4방 탐색을 통해 구현하는 문제로, 구현 알고리즘의 기본 +@ 느낌의 문제이다.
- 난이도가 높지 않은 구현 문제이므로, 문제에서 요구한 조건을 다 충족시키면 된다.
과정
- 문자를 담을 격자판
grid
를 초기화하면서, S
를 찾으면 이를 시작점으로 초기화한다. 시작점은 현재 위치를 나타낼 배열인 pos
에 담는다. (grid
를 만들지 않고, park
배열을 그대로 사용해도 무방하다.)
- 입력받은
routes
내의 명령에 따라, 방향을 정하고, 몇칸 움직일지에 대한 정보를 통해 이동을 시작한다.
- 현재 위치를 임시변수인
r
과 c
에 넣고, 명령대로 이동을 수행한다. 이때 공원의 범위를 벗어나거나, 지나갈 수 없는 칸이면 isValid
의 값을 false
로 바꾸고 해당 명령을 취소한다.
- 명령이 수행 가능한지의 여부는
isValid
를 통해 판단한다. 가능하면 pos
배열의 값을 변경하고, 그렇지 않다면 다음 명령으로 이동한다.
- 이 과정을 반복하면
pos
배열에 마지막 위치가 저장된다.