개발자를 희망하는 죠르디가 카카오에 면접을 보러 왔습니다.
코로나 바이러스 감염 예방을 위해 응시자들은 거리를 둬서 대기를 해야하는데 개발 직군 면접인 만큼
아래와 같은 규칙으로 대기실에 거리를 두고 앉도록 안내하고 있습니다.
- 대기실은 5개이며, 각 대기실은 5x5 크기입니다.
- 거리두기를 위하여 응시자들 끼리는 맨해튼 거리1가 2 이하로 앉지 말아 주세요.
- 단 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용합니다.
예를 들어,
위 그림처럼 자리 사이에 파티션이 존재한다면 맨해튼 거리가 2여도 거리두기를 지킨 것입니다. | 위 그림처럼 파티션을 사이에 두고 앉은 경우도 거리두기를 지킨 것입니다. | 위 그림처럼 자리 사이가 맨해튼 거리 2이고 사이에 빈 테이블이 있는 경우는 거리두기를 지키지 않은 것입니다. |
응시자가 앉아있는 자리(P)를 의미합니다. | 빈 테이블(O)을 의미합니다. | 파티션(X)을 의미합니다. |
5개의 대기실을 본 죠르디는 각 대기실에서 응시자들이 거리두기를 잘 기키고 있는지 알고 싶어졌습니다. 자리에 앉아있는 응시자들의 정보와 대기실 구조를 대기실별로 담은 2차원 문자열 배열 places가 매개변수로 주어집니다. 각 대기실별로 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 배열에 담아 return 하도록 solution 함수를 완성해 주세요.
places의 각 행은 하나의 대기실 구조를 나타냅니다.
places 원소의 길이(대기실 가로 길이) = 5
P는 응시자가 앉아있는 자리를 의미합니다.
O는 빈 테이블을 의미합니다.
X는 파티션을 의미합니다.
1차원 정수 배열에 5개의 원소를 담아서 return 합니다.
places에 담겨 있는 5개 대기실의 순서대로, 거리두기 준수 여부를 차례대로 배열에 담습니다.
각 대기실 별로 모든 응시자가 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 담습니다.
BFS
맨하튼거리 ≤ 2
= BFS route ≤ 2
BFS
를 한다.(=queue에 삽입하지 않음)
visited
route
배열을 초기화 해주니까 통과했다.#include <iostream>
#include <string>
#include <vector>
#include <queue>
using namespace std;
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};
bool bfs(int startX, int startY, vector<string> &arr){
queue<pair<int, int>> q;
bool visited[5][5]={0,};
int route[5][5]={0,};
visited[startX][startY] = true;
route[startX][startY] = 0;
q.push({startX, startY});
while (!q.empty()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
if(route[x][y] == 2) break;
for(int i=0; i<4; ++i){
int nx = x + dx[i];
int ny = y + dy[i];
if(nx < 0 || nx >= 5 || ny < 0 || ny >= 5) continue;
if(visited[nx][ny] || arr[nx][ny] == 'X') continue;
if(arr[nx][ny] == 'P') return false;
q.push({nx, ny});
visited[nx][ny] = true;
route[nx][ny] = route[x][y] + 1;
}
}
return true;
}
vector<int> solution(vector<vector<string>> places) {
vector<int> answer;
for(int i=0; i<5; ++i){
bool social_distance = true;
for(int j = 0; j < 5; ++j){
for(int k = 0; k < 5; ++k){
if(!social_distance) break;
if(places[i][j][k] == 'P' && !bfs(j, k, places[i])){
social_distance = false;
}
}
}
answer.push_back(social_distance);
}
return answer;
}