1. 제출 코드 (1시간 20분 14초 / 구현)
import java.util.*;
class Solution {
public int[] solution(String[][] places) {
int[] answer = new int[5];
Arrays.fill(answer, 1);
for(int i = 0; i < 5; i++) {
String[] curr = places[i];
for(int j = 0; j < 5; j++) {
String t = places[i][j];
for(int k = 0; k < 5; k++) {
if(t.charAt(k) == 'P') {
answer[i] = isValid(j, k, curr) ? 1 : 0;
if(answer[i] == 0) break;
}
}
if(answer[i] == 0) break;
}
}
return answer;
}
public static boolean isValid(int x, int y, String[] place) {
int[] dx = {0, 0, -1, 1, -1, -1, 1, 1};
int[] dy = {1, -1, 0, 0, -1, 1, -1, 1};
// 상하좌우 탐색
for(int i = 0; i < 4; i++) {
for(int j = 1; j <= 2; j++) {
int nx = x + dx[i] * j;
int ny = y + dy[i] * j;
if(nx < 0 || nx > 4 || ny < 0 || ny > 4) {
continue;
}
if(place[nx].charAt(ny) == 'X') break;
if(place[nx].charAt(ny) == 'P') {
return false;
}
}
}
// 대각선 탐색
for(int i = 4; i < 8; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if(nx < 0 || nx > 4 || ny < 0 || ny > 4) {
continue;
}
if(place[nx].charAt(ny) == 'P') {
if(place[nx].charAt(y) == 'X' && place[x].charAt(ny) == 'X') {
continue;
} else {
return false;
}
}
}
return true;
}
}
2. 구현 로직
- 응시자가 없는 경우를 고려해서 answer의 값을 1로 모두 초기화
- 대기실의 모든 좌표를 탐색하는데, 응시자가 있을 경우 isValid() 실행
- 응시자 주변에 거리두기를 만족하는지 검사하는 함수
- 맨해튼 거리만큼 상하좌우를 탐색하는데 중간에 파티션 'X'를 만나면 거리두기를 고려할 필요가 없으므로 break 하고 다른 응시자를 만날경우 False
- 맨해튼 거리만큼 대각선을 탐색하는데 다른 응시자를 만날경우 주변에 파티션이 있는 지 체크해서 있다면 continue로 탐색 지속, 파티션이 없다면 False
- isValid의 결과를 answer[i]에 삽입하고 만약, answer[i]가 0이라면 더이상 대기실을 탐색할 필요가 없으므로 탐색 종료
3. 회고
- answer의 배열을 모두 1로 채움으로써 응시자가 없을 때의 경우를 고려하지 않은 것이 좋았던 거 같다.