개발자를 희망하는 죠르디가 카카오에 면접을 보러 왔습니다.
코로나 바이러스 감염 예방을 위해 응시자들은 거리를 둬서 대기를 해야하는데 개발 직군 면접인 만큼
아래와 같은 규칙으로 대기실에 거리를 두고 앉도록 안내하고 있습니다.
- 대기실은 5개이며, 각 대기실은 5x5 크기입니다.
- 거리두기를 위하여 응시자들 끼리는 맨해튼 거리1가 2 이하로 앉지 말아 주세요.
- 단 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용합니다.
예를 들어,
5개의 대기실을 본 죠르디는 각 대기실에서 응시자들이 거리두기를 잘 기키고 있는지 알고 싶어졌습니다. 자리에 앉아있는 응시자들의 정보와 대기실 구조를 대기실별로 담은 2차원 문자열 배열 places
가 매개변수로 주어집니다. 각 대기실별로 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 배열에 담아 return 하도록 solution 함수를 완성해 주세요.
places
의 행 길이(대기실 개수) = 5places
의 각 행은 하나의 대기실 구조를 나타냅니다.places
의 열 길이(대기실 세로 길이) = 5places
의 원소는 P
,O
,X
로 이루어진 문자열입니다.places
원소의 길이(대기실 가로 길이) = 5P
는 응시자가 앉아있는 자리를 의미합니다.O
는 빈 테이블을 의미합니다.X
는 파티션을 의미합니다.places
에 담겨 있는 5개 대기실의 순서대로, 거리두기 준수 여부를 차례대로 배열에 담습니다.class Solution {
private static final int SIZE = 5;
private static String[] map;
private static int[] dx = {-1, 0, 1, 0};
private static int[] dy = {0, 1, 0, -1};
private static int[] ddx = {-2, 0, 2, 0};
private static int[] ddy = {0, 2, 0, -2};
private static int[] dddx = {-1, 1, 1, -1};
private static int[] dddy = {1, 1, -1, -1};
public int[] solution(String[][] places) {
int[] answer = new int[places.length];
for (int i = 0; i < SIZE; i++) {
map = places[i];
boolean flag = false;
for (int j = 0; j < SIZE; j++) {
for (int k = 0; k < SIZE; k++) {
char c = map[j].charAt(k);
if (c == 'P') {
if (isPerfect(j, k)) {
flag = true;
break;
}
}
}
if (flag) {
answer[i] = 0;
break;
}
}
if(!flag) answer[i] = 1;
}
return answer;
}
private boolean isPerfect(int x, int y) {
int curX = x;
int curY = y;
for (int i = 0; i < 4; i++) {
int nextX = curX + dx[i];
int nextY = curY + dy[i];
if (!isScope(nextX, nextY)) continue;
if (map[nextX].charAt(nextY) == 'P') return true;
}
for (int i = 0; i < 4; i++) {
int nextX = curX + ddx[i];
int nextY = curY + ddy[i];
if (!isScope(nextX, nextY)) continue;
if (map[nextX].charAt(nextY) == 'P') {
if (map[(nextX + curX) / 2].charAt((nextY + curY) / 2) != 'X') return true;
}
}
for (int i = 0; i < 4; i++) {
int nextX = curX + dddx[i];
int nextY = curY + dddy[i];
if (!isScope(nextX, nextY)) continue;
if (map[nextX].charAt(nextY) == 'P') {
if (!(map[curX].charAt(nextY) == 'X' && map[nextX].charAt(curY) == 'X')) {
return true;
}
}
}
return false;
}
private static boolean isScope(int x, int y) {
return x >= 0 && y >= 0 && x < SIZE && y < SIZE;
}
}
dx
, dy
)와 2칸 떨어진 상하좌우(ddx
, ddy
)와 대각선(dddx
, dddy
)를 고려한 메서드를 생성했다.