C++:: 프로그래머스 < 거리두기 확인하기 >

jahlee·2023년 6월 1일
0

프로그래머스_Lv.2

목록 보기
53/106
post-thumbnail

매개변수로 주어지는 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;
}

0개의 댓글