📄 문제
개발자를 희망하는 죠르디가 카카오에 면접을 보러 왔습니다.
코로나 바이러스 감염 예방을 위해 응시자들은 거리를 둬서 대기를 해야하는데 개발 직군 면접인 만큼
아래와 같은 규칙으로 대기실에 거리를 두고 앉도록 안내하고 있습니다.
- 대기실은 5개이며, 각 대기실은 5x5 크기입니다.
- 거리두기를 위하여 응시자들 끼리는 맨해튼 거리1가 2 이하로 앉지 말아 주세요.
- 단 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용합니다.
5개의 대기실을 본 죠르디는 각 대기실에서 응시자들이 거리두기를 잘 기키고 있는지 알고 싶어졌습니다. 자리에 앉아있는 응시자들의 정보와 대기실 구조를 대기실별로 담은 2차원 문자열 배열 places가 매개변수로 주어집니다. 각 대기실별로 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 배열에 담아 return 하도록 solution 함수를 완성해 주세요.
📝 풀이
#include <string>
#include <vector>
using namespace std;
int sDx[4]{ -1, 1, 0, 0 };
int sDy[4]{ 0, 0, -1, 1 };
int nsDx[4]{ -1, 1, 1, -1 };
int nsDy[4]{ -1, -1, 1, 1 };
int nsDsx[4][2]{ {-1, 0}, {0, 1}, {1, 0}, {0, -1} };
int nsDsy[4][2]{ {0, -1}, {-1, 0}, {0, 1}, {1, 0} };
bool success(vector<string> s)
{
for (int y = 0; y < 5; ++y)
for (int x = 0; x < 5; ++x)
{
// 해당 위치에 사람이 있지 않으면 검사하지 않음
if (s[y][x] != 'P')
continue;
for (int i = 0; i < 4; ++i)
{
int yy = y + sDy[i];
int xx = x + sDx[i];
if (yy == -1 || yy == 5 || xx == -1 || xx == 5)
continue;
// 상하좌우 방향에 사람이 있다면 거리두기 규칙 X
if (s[yy][xx] == 'P')
return false;
// 상하좌우 방향에 빈 테이블일경우
if (s[yy][xx] == 'O')
{
// 그 다음 칸에 사람이 있는지 검사
int yyy = yy + sDy[i];
int xxx = xx + sDx[i];
if (yyy == -1 || yyy == 5 || xxx == -1 || xxx == 5)
continue;
if (s[yyy][xxx] == 'P')
return false;
}
}
for (int i = 0; i < 4; ++i)
{
int yy = y + nsDy[i];
int xx = x + nsDx[i];
if (yy == -1 || yy == 5 || xx == -1 || xx == 5)
continue;
// 대각선 위치에 사람이 있다면?
if (s[yy][xx] == 'P') // 대각선 위치를 가리는 두 방향에 하나라도 파티션이 없다면 거리두기 규칙 X
if (s[y + nsDsy[i][0]][x + nsDsx[i][0]] != 'X' || s[y + nsDsy[i][1]][x + nsDsx[i][1]] != 'X')
return false;
}
}
return true;
}
vector<int> solution(vector<vector<string>> places) {
vector<int> answer;
for (vector<string> v : places)
answer.push_back(success(v) ? 1 : 0);
printf("%d", answer[0]);
return answer;
}
- 직관적인 풀이 방식으로, 모든 방향에 대하여 검사를 진행합니다.
'algorithms (C++)' 카테고리의 다른 글
[C++][프로그래머스] 메뉴 리뉴얼 🔥 (2) | 2023.11.10 |
---|---|
[C++][프로그래머스] 괄호 회전하기 (0) | 2023.11.08 |
[C++][프로그래머스] 빛의 경로 사이클 (0) | 2023.11.08 |
[C++][프로그래머스] 전력망을 둘로 나누기 (0) | 2023.11.07 |
[C++][프로그래머스] 할인행사 (0) | 2023.11.07 |