문제 설명
개발자를 희망하는 죠르디가 카카오에 면접을 보러 왔습니다.코로나 바이러스 감염 예방을 위해 응시자들은 거리를 둬서 대기를 해야하는데 개발 직군 면접인 만큼아래와 같은 규칙으로 대기실에 거리를 두고 앉도록 안내하고 있습니다.
대기실은 5개이며, 각 대기실은 5x5 크기입니다.거리두기를 위하여 응시자들 끼리는 맨해튼 거리1가 2 이하로 앉지 말아 주세요.단 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용합니다.
예를 들어,
5개의 대기실을 본 죠르디는 각 대기실에서 응시자들이 거리두기를 잘 기키고 있는지 알고 싶어졌습니다. 자리에 앉아있는 응시자들의 정보와 대기실 구조를 대기실별로 담은 2차원 문자열 배열 places가 매개변수로 주어집니다. 각 대기실별로 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 배열에 담아 return 하도록 solution 함수를 완성해 주세요.
제한사항
•
places의 행 길이(대기실 개수) = 5
◦
places의 각 행은 하나의 대기실 구조를 나타냅니다.
•
places의 열 길이(대기실 세로 길이) = 5
•
places의 원소는 P,O,X로 이루어진 문자열입니다.
◦
places 원소의 길이(대기실 가로 길이) = 5
◦
P는 응시자가 앉아있는 자리를 의미합니다.
◦
O는 빈 테이블을 의미합니다.
◦
X는 파티션을 의미합니다.
•
입력으로 주어지는 5개 대기실의 크기는 모두 5x5 입니다.
•
return 값 형식
◦
1차원 정수 배열에 5개의 원소를 담아서 return 합니다.
◦
places에 담겨 있는 5개 대기실의 순서대로, 거리두기 준수 여부를 차례대로 배열에 담습니다.
◦
각 대기실 별로 모든 응시자가 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 담습니다.
입출력 예
places | result |
[["POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"], ["POOPX", "OXPXP", "PXXXO", "OXXXO", "OOOPP"], ["PXOPX", "OXOXP", "OXPOX", "OXXOP", "PXPOX"], ["OOOXX", "XOOOX", "OOOXX", "OXOOX", "OOOOO"], ["PXPXP", "XPXPX", "PXPXP", "XPXPX", "PXPXP"]] | [1, 0, 1, 1, 1] |
입출력 예 설명
입출력 예 #1
첫 번째 대기실
No. | 0 | 1 | 2 | 3 | 4 |
0 | P | O | O | O | P |
1 | O | X | X | O | X |
2 | O | P | X | P | X |
3 | O | O | X | O | X |
4 | P | O | X | X | P |
•
모든 응시자가 거리두기를 지키고 있습니다.
두 번째 대기실
No. | 0 | 1 | 2 | 3 | 4 |
0 | P | O | O | P | X |
1 | O | X | P | X | P |
2 | P | X | X | X | O |
3 | O | X | X | X | O |
4 | O | O | O | P | P |
•
(0, 0) 자리의 응시자와 (2, 0) 자리의 응시자가 거리두기를 지키고 있지 않습니다.
•
(1, 2) 자리의 응시자와 (0, 3) 자리의 응시자가 거리두기를 지키고 있지 않습니다.
•
(4, 3) 자리의 응시자와 (4, 4) 자리의 응시자가 거리두기를 지키고 있지 않습니다.
세 번째 대기실
No. | 0 | 1 | 2 | 3 | 4 |
0 | P | X | O | P | X |
1 | O | X | O | X | P |
2 | O | X | P | O | X |
3 | O | X | X | O | P |
4 | P | X | P | O | X |
•
모든 응시자가 거리두기를 지키고 있습니다.
네 번째 대기실
No. | 0 | 1 | 2 | 3 | 4 |
0 | O | O | O | X | X |
1 | X | O | O | O | X |
2 | O | O | O | X | X |
3 | O | X | O | O | X |
4 | O | O | O | O | O |
•
대기실에 응시자가 없으므로 거리두기를 지키고 있습니다.
다섯 번째 대기실
No. | 0 | 1 | 2 | 3 | 4 |
0 | P | X | P | X | P |
1 | X | P | X | P | X |
2 | P | X | P | X | P |
3 | X | P | X | P | X |
4 | P | X | P | X | P |
•
모든 응시자가 거리두기를 지키고 있습니다.
두 번째 대기실을 제외한 모든 대기실에서 거리두기가 지켜지고 있으므로, 배열 [1, 0, 1, 1, 1]을 return 합니다.
제한시간 안내
•
정확성 테스트 : 10초
※ 공지 - 2022년 4월 25일 테스트케이스가 추가되었습니다.
나의 풀이
class Solution {
public int[] solution(String[][] places) {
int[] answer = new int[5];
for (int i = 0; i < 5; i++) {
answer[i] = check(places[i]);
}
return answer;
}
int check(String[] place) {
int[] dCol = {-1, 0, 1, 0};
int[] dRow = {0, 1, 0, -1};
// 행 검사
for (int row = 0; row < 5; row++) {
// 열 검사
for (int col = 0; col < 5; col++) {
char val = place[row].charAt(col);
if (val != 'P') {
continue;
}
// 상하좌우 검사
for (int dir = 0; dir < 4; dir++) {
int nCol = col + dCol[dir];
int nRow = row + dRow[dir];
// 경계조건 검사
if (0 <= nCol && nCol < 5 && 0 <= nRow && nRow < 5) {
char nVal = place[nRow].charAt(nCol);
if (nVal == 'P') {
return 0;
}
if (nVal == 'X') {
continue;
}
// 3방향 검사
for (int dir2 = 0; dir2 < 4; dir2++) {
// 역방향 검사 제외
if ((dir + 2) % 4 == dir2) {
continue;
}
int nCol2 = nCol + dCol[dir2];
int nRow2 = nRow + dRow[dir2];
// 경계조건 검사
if (0 <= nCol2 && nCol2 < 5 && 0 <= nRow2 && nRow2 < 5) {
char nVal2 = place[nRow2].charAt(nCol2);
if (nVal2 == 'P') {
return 0;
}
if (nVal2 == 'X') {
continue;
}
}
} // 3방향 검사
} // 경계조건 검사
} // 상하좌우 검사
} // 열 검사
} // 행 검사
return 1;
}
}
Java
복사
Remark
•
풀이 아이디어
◦
사람(P)을 만나면 상하좌우 검사
▪
P가 있으면 return 0
▪
X가 있으면 continue
▪
O가 있으면 역방향 제외 3방향 검사
•
P가 있으면 return 0
•
X가 있으면 continue
•
여러번 만났던 방향 탐색 문제. dX, dY를 이용한 아이디어를 자주 사용하게 되는 것 같다.
•
다른 분들 풀이를 보니 테이블을 기준으로 잡고 검사를 하기도 하는 듯