[Programmers] 거리두기 확인하기(Lv.2)

Alice·2023년 7월 29일
0

풀이 소요시간 : 30분

단순 구현문제다. 문제를 읽으면서 살짝 머리가 복잡했지만, 구현에 참고해야할 규칙의 수가 적었기때문에 단번에 구현할 수 있었다. 예전의 나였으면 이런 문제를 푸는데 굳이굳이 BFS 를 사용했을 법도 하다. 이런 류의 문제는 깡구현이 답이다.

전체 코드

#include <string>
#include <vector>

using namespace std;

int T, N, M;
char Map[6][6];
vector<int> Ans;

//상하 좌우 테스트
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};

//대각선 테스트
int cx[4] = {1, 1, -1, -1};
int cy[4] = {1, -1, 1, -1};

//맨해튼 거리 2 이내 체크
bool Check_Dist(int x, int y) {
    
    //1 단계 : 상하좌우 체크(맨해튼 거리 1)
    for(int i = 0; i < 4; i++)
    {
        int nx = x + dx[i];
        int ny = y + dy[i];
        
        if(nx < 1 || ny < 1 || nx > 5 || ny > 5) continue;
        
        if(Map[nx][ny] == 'P') return false;
    }
    
    
    //2 단계 : 대각선 체크(맨해튼 거리 2)
    for(int i = 0; i < 4; i++)
    {
        int nx = x + cx[i];
        int ny = y + cy[i];
        //대각선 좌표
        
        if(nx < 1 || ny < 1 || nx > 5 || ny > 5) continue;
        
        //거리두기 대상 발견
        if(Map[nx][ny] == 'P')
        {
            if(i == 0) //우측 하단
            {
                if(!(Map[x + 1][y] == 'X' && Map[x][y + 1] == 'X')) return false;
            }
            else if(i == 1) //좌측 하단
            {
                if(!(Map[x + 1][y] == 'X' && Map[x][y - 1] == 'X')) return false;
            }
            else if(i == 2) //우측 상단
            {
                if(!(Map[x - 1][y] == 'X' && Map[x][y + 1] == 'X')) return false;
            }
            else if(i == 3) // 좌측 상단
            {
                if(!(Map[x - 1][y] == 'X' && Map[x][y - 1] == 'X')) return false;
            }
        }
    }
    
    
    //3단계 2칸 수직, 수평거리 테스트(맨해튼 거리 2)
    for(int i = 0; i < 4; i++)
    {
        int nx = x + 2 * dx[i];
        int ny = y + 2 * dy[i];
        
        if(nx < 1 || ny < 1 || nx > 5 || ny > 5) continue;
        
        if(Map[nx][ny] == 'P')
        {
            if(i == 0)
            {
                if(Map[x + 1][y] != 'X') return false;
            }
            else if(i == 1)
            {
                if(Map[x - 1][y] != 'X') return false;
            }
            else if(i == 2)
            {
                if(Map[x][y + 1] != 'X') return false;
            }
            else if(i == 3)
            {
                if(Map[x][y - 1] != 'X') return false;
            }
        }
    }
    
    
    
    return true;
    
}






vector<int> solution(vector<vector<string>> places) {
    
    T = places.size();         // 5
    N = places[0].size();      // 5
    M = places[0][0].length(); // 5
    
    for(int t = 0; t < T; t++)
    {
        for(int i = 0; i < N; i++)
        {
            for(int j = 0; j < M; j++)
            {
                Map[i + 1][j + 1] = places[t][i][j];
            }
        }
        //전역 데이터 초기화
        
        
        for(int i = 1; i <= N; i++)
        {
            for(int j = 1; j <= M; j++)
            {
                if(Map[i][j] == 'P')
                {
                    if(Check_Dist(i, j) == false) 
                    {
                        goto fail;
                    }
                }
            }
        }
        
        goto succ;
        
        
        //거리두기 실패
        fail :
        Ans.push_back(0);
        continue;
        
        //거리두기 성공
        succ :
        Ans.push_back(1);
        continue;
        
    }
    
    return Ans;
    
}
profile
SSAFY 11th

0개의 댓글