문제풀이 흐름

  1. 대기실의 모든 응시자 위치에 대해 반복
    1. 상하좌우 중 빈 테이블이 있는 방향에 대해 1-B로 진행
    2. 빈 테이블과 인접한 위치 중 응시자가 있다면 거리두기를 지키지 않은 것
  2. 모든 응시자의 위치를 검사했으나 거리두기를 지키지 않은 경우를 발견하지 못했으면 거리두기를 지킨 것

코드 작성

우선 입력이 String[][] 형식으로 들어오고, 대기실 하나는 String[] 형식이 됩니다. 우리는 원소 하나하나에 관심이 있고 각 대기실이 거리두기를 지키는지 검사할 것이므로 대기실을 char[][] 형식으로 만들어 주고, 거리두기 결과를 저장할 배열을 선언합니다.

int[] answer = new int[places.length];
for (int i = 0; i < answer.lenght; i++){
	String[] place = places[i];
	char[][] room = new char[place.length][];
	for (int j = 0; j < room.length; j++) {
		room[j] = place[j].toCharArray();
	}
	// 거리두기 검사 후 answer에 기록
}
return answer;

거리두기를 지키고 있는지 검사하는 idDistanced() 메서드를 선언합니다.

private boolean isDistanced(char[][] room) {
		// 거리두기 검사
		return true;
}

1. 대기실의 모든 응시자 위치에 대해 반복

대기실에서 응시자가 앉아 있는 모든 위치에 대해 거리두기 검사를 진행해야 합니다. 다음과 같이 응시자가 앉아 있지 않은 위치들은 continue; 키워드로 검사를 건너뛰도록 합니다. (P는 응시자가 앉아 있는 자리, O는 빈 테이블, X는 파티션)

for (int y = 0; y < room.length; y++) {
	for (int x = 0; x < room[y].length; x++) {
		if (room[y][x] != 'P') continue;
			//거리두기 검사
	}
}

다음으로 해당 대기실에서 응시자의 위치 (x, y)가 거리두기를 지키는지 검사하는 메서드를 선언합니다.

private boolean isDistanced(char [][] room, int x, int y) { //overloading
	// room[y][x]가 거리두기를 지키는지 검사
	return true;
}

1-A. 상하좌우 중 빈 테이블에 있는 방향에 대해 1-B로 진행

상하 좌우 검색을 위해 dx, dy를 선언

private static final int dx[] = {0,0,-1,1};
private static final int dy[] = {-1,1,0,0};

2차원 배열의 length 필드를 이용하여 범위 검사를 할 때는 y 속성을 x속성보다 먼저 검사해야 안전합니다.

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]를 통해 다른 응시자에게 도달할 수 있는지 검사
}