따라서 검사를 제외할 방향도 함께 넘겨주어야 합니다. exclude 방향을 제외한 네 방향에 다른 응시자가 있는지 검사하는 isNextToVolunteer() 메서드를 다음과 같이 정의합니다.
private boolean isNextToVolunteer(char[][] room, int x, int y, int exclude) {
for (int d = 0; d < 4; d++) {
if (d == exclude) continue;
int nx = x + dx[d];
int ny = y + dy[d];
if (ny < 0 || ny >= room.length || nx < 0 || nx >= room[ny].length) continue;
if (room[ny][nx] == 'P') return true;
}
return false;
}
isNextToVolunteer() 메서드가 준비되었으니 isDistanced(room, x, y) 메서드를 완성할 수 있습니다. 하지만 이 메서드에서 알고 있는 정보는 (x, y)에서의 진행 방향 정보입니다. 우리가 제외해야 할 것은 그 반대 방향이므로 방향 d를 이용하여 반대 방향 exclude를 계산해야 합니다.
이 문제에서는 방향에 순서가 없습니다. 앞서 살펴본 삼각 달팽이 문제는 ‘아래 → 오른쪽 → 왼쪽 위’라는 순서가 있었습니다. 이 문제는 상하좌우를 모두 검사하기만 하면 되므로 검사하는 순서는 상관없습니다. 따라서 상하좌우 대신 다음과 같이 상좌우하 방향으로 dx, dy를 수정합니다.
private static final int dx[] = {0, -1, 1, 0};
private static final int dy[] = {-1, 0, 0, 1};