🖊️ 문제
개발자를 희망하는 죠르디가 카카오에 면접을 보러 왔습니다.
코로나 바이러스 감염 예방을 위해 응시자들은 거리를 둬서 대기를 해야하는데 개발 직군 면접인 만큼
아래와 같은 규칙으로 대기실에 거리를 두고 앉도록 안내하고 있습니다.
- 대기실은 5개이며, 각 대기실은 5x5 크기입니다.
- 거리두기를 위하여 응시자들 끼리는 맨해튼 거리 2 이하로 앉지 말아 주세요.
- 단 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용합니다.
예를 들어,
5개의 대기실을 본 죠르디는 각 대기실에서 응시자들이 거리두기를 잘 기키고 있는지 알고 싶어졌습니다. 자리에 앉아있는 응시자들의 정보와 대기실 구조를 대기실별로 담은 2차원 문자열 배열 places가 매개변수로 주어집니다. 각 대기실별로 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 배열에 담아 return 하도록 solution 함수를 완성해 주세요.
제한사항
1. places의 행 길이(대기실 개수) = 5
- places의 각 행은 하나의 대기실 구조를 나타냅니다.
2. places의 열 길이(대기실 세로 길이) = 5
3. places의 원소는 P,O,X로 이루어진 문자열입니다.
- places 원소의 길이(대기실 가로 길이) = 5
- P는 응시자가 앉아있는 자리를 의미합니다.
- O는 빈 테이블을 의미합니다.
- X는 파티션을 의미합니다.
4. 입력으로 주어지는 5개 대기실의 크기는 모두 5x5 입니다.
5. return 값 형식
- 1차원 정수 배열에 5개의 원소를 담아서 return 합니다.
- places에 담겨 있는 5개 대기실의 순서대로, 거리두기 준수 여부를 차례대로 배열에 담습니다.
- 각 대기실 별로 모든 응시자가 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 담습니다.
🖥️ 코드
#include <string>
#include <vector>
#include <queue>
using namespace std;
struct Developer
{
int y, x, dist;
Developer(int _y, int _x, int _dist)
{
y = _y;
x = _x;
dist = _dist;
}
};
bool BFS(int room, int startY, int startX, vector<vector<string>> places)
{
//상 하 좌 우
vector<int> dirY = {-1, 1, 0, 0};
vector<int> dirX = {0, 0, -1, 1};
bool visited[5][5] = {false, };
visited[startY][startX] = true;
queue<Developer> q;
q.push({startY, startX, 0});
while(!q.empty())
{
Developer now = q.front();
q.pop();
if(now.dist > 2)
return false;
for(int i = 0; i < 4; i++)
{
int nextY = now.y + dirY[i];
int nextX = now.x + dirX[i];
if(nextY < 0 || nextY > 4 || nextX < 0 || nextX > 4)
continue;
if(visited[nextY][nextX])
continue;
if(places[room][nextY][nextX] == 'X')
continue;
int nextDist = now.dist + 1;
if(places[room][nextY][nextX] == 'P' && nextDist <= 2)
return true;
visited[nextY][nextX] = true;
q.push({nextY, nextX, nextDist});
}
}
return false;
}
vector<int> solution(vector<vector<string>> places)
{
vector<int> answer;
for(int i = 0; i < places.size(); i++)
{
int inValid = false;
for(int y = 0 ; y < 5; y++)
{
for(int x = 0; x < 5; x++)
{
if(places[i][y][x] == 'P')
inValid = BFS(i, y, x, places);
if(inValid) break;
}
if(inValid) break;
}
if(inValid) answer.push_back(0);
else answer.push_back(1);
}
return answer;
}
🤔 나의 생각
대기실의 지원자를 중심으로 상하좌우로 뻗어가며 다른 지원자가 맨해튼 거리 2이하에 있는지 검사해야 한다.
여기서 상하좌우 검사를 BFS로 하면 된다. 단! BFS를 돌며 큐에서 뽑은 응시자의 거리가 3 이상이라면 더 이상 검사를 할 필요가 없다는 조건을 달아줘야 한다!
+ 카카오 테크에서 해설을 보니 BFS가 적합하다고 적혀있어서 매우 기뻤다 ㅎ..
'Algorithm > 프로그래머스 : Level 2' 카테고리의 다른 글
[프로그래머스 Level 2] 124 나라의 숫자 (0) | 2021.11.13 |
---|---|
[프로그래머스 Level 2] 단체사진 찍기 (2017 카카오 기출) (0) | 2021.11.12 |
[프로그래머스 Level 2] 뉴스 클러스터링 (2018 카카오 기출) (0) | 2021.11.12 |
[프로그래머스 Level 2] 괄호 변환 (2020 카카오 기출) (0) | 2021.11.12 |
[프로그래머스 Level 2] 카카오프렌즈 컬리링북 (2017 카카오 기출) (0) | 2021.11.11 |