매개변수로 주어지는 place가 2차원 배열인줄 알고 착각하여 풀다가 시간을 많이 버린 문제이다. 항상 조건과 인자들을 잘 확인하고 문제를 풀자....
#include <string>
#include <vector>
using namespace std;
bool check_dis(int a_x, int a_y, int b_x, int b_y, vector<string> place)
{
int x_min = min(a_x, b_x), y_min = min(a_y, b_y);
if (abs(a_x - b_x) + abs(a_y - b_y) > 2) return false;// 맨해튼 거리 지켜졌다면
if (a_x == b_x) if(place[a_x][y_min+1] == 'X') return false;// 중간에 파티션 있는지
if (a_y == b_y) if(place[x_min+1][a_y] == 'X') return false;// 중간에 파티션 있는지
if (a_x != b_x && a_y != b_y)
{// 정사각형모양에서 양 구석에 사람들이 있는경우
int partition = 0;
for(int i=x_min;i<=x_min+1;i++)
for(int j=y_min;j<=y_min+1;j++) if (place[i][j] == 'X') partition++;
if (partition == 2) return false;
}
return true;
}
vector<int> solution(vector<vector<string>> places)
{
vector<int> answer;
for(int cnt=0;cnt<5;cnt++)
{// 5 개의 장소 확인
vector<pair<int,int>> person;
int res = 1;
for(int i=0;i<5;i++)// 사람들 앉은 자리 좌표 넣어주기
for(int j=0;j<5;j++) if(places[cnt][i][j] == 'P') person.push_back({i,j});
for(int i=0;i<person.size() && res == 1;i++)
for(int j=i+1;j<person.size() && res == 1;j++)// 사람들끼리 거리 비교
if (check_dis(person[i].first, person[i].second, person[j].first, person[j].second, places[cnt]))// 맨해튼 거리 안지켜졌다면
res = 0;
answer.push_back(res);
}
return answer;
}