이제 dx, dy를 이용하여 상하좌우를 살펴볼 수 있습니다. 다음과 같이 상하좌우 위치를 가져오고, 해당 위치가 범위를 벗어나지 않는지 검사합니다.
for (int d = 0; d < 4; d++) {
int nx = x + dx[d];
int ny = y + dy[d];
if (ny < 0 || ny >= room.length || nx < 0 || nx >= room[ny].length) continue;
// room[ny][nx]를 통해 다른 응시자에게 도달할 수 있는지 검사
}
잠깐만요
2차원 배열의 length 필드를 이용하여 범위 검사를 할 때는 y 속성을 x 속성보다 먼저 검사해야 안전합니다. 자바의 or(||) 연산은 앞선 조건이 true이면 뒤 조건을 연산하지 않습니다. 다음과 같이 x 검사를 먼저 하는 코드가 있다고 합시다.
nx < 0 || nx >= room[ny].length || ny < 0 || ny >= room.length
이 경우 ny가 배열 범위를 벗어난 값이 들어 있다면 nx >= room[ny].length를 연산할 때 IndexOutOfBounds Exception이 발생합니다. 반면 해설의 코드처럼 ny에 대한 검사를 먼저 한다면 room[ny].length를 연산하는 시점에는 이미 ny에 대한 범위 검사를 통과한 이후이므로 안전하게 참조할 수 있습니다.