호지

[프로그래머스] 거리두기 확인하기 문제풀이 c++ 본문

알고리즘/프로그래머스

[프로그래머스] 거리두기 확인하기 문제풀이 c++

_hoji

문제를 조금 더 깔끔하게 푸는 법을 연습해야겠다.

 

모든 대기방에 대해서 거리두기를 확인하는 문제이다.

확인할 경우는 총 3가지이다.

 

1. 상하좌우로 2칸 떨어진 곳에 P가 있으면 사이에 파티션이 있는가

(없으면 거리두기X)

    P    
    X    
P X P X P
    X    
    P    

 

2. 대각선에 P가 있으면 그 사이에 파티션이 2개 있는가

(없으면 거리두기X)

P X P
X P X
P X P

 

3. 상하좌우 1칸 떨어진곳에 P가 있는가

  P  
P P P
  P  

find함수에서 위 3가지 조건을 확인하여 거리두기가 확인되면 1, 거리두기가 아니면 0을 반환한다

* 상하좌우에 +2를 추가하여 room[5][5]가 아닌 room[9][9]를 전역변수로 선언하였다.(범위 확인 X)

 

#include <string>
#include <vector>

using namespace std;

int room[9][9];

int find(){
    int xx[4] = {2,0,-2,0};
    int yy[4] = {0,2,0,-2};
    int x[4] = {1,0,-1,0};
    int y[4] = {0,1,0,-1};
    int dx[4] = {-1,-1,1,1};
    int dy[4] = {-1,1,-1,1};
    for(int i=2; i<7; i++){
        for(int j=2; j<7; j++){
            if(room[i][j] == 'P'){
                for(int k=0; k<4; k++){
                    if(room[i+xx[k]][j+yy[k]]=='P'){
                        if(room[i+x[k]][j+y[k]] != 'X')
                            return 0;
                    }
                    if(room[i+x[k]][j+y[k]] == 'P')
                        return 0;
                    if(room[i+dx[k]][j+dy[k]] == 'P'){
                        if(room[i+dx[k]][j]!='X' || room[i][j+dy[k]]!='X')
                            return 0;
                    }
                }
            }
        }
    }  
    return 1;
}
vector<int> solution(vector<vector<string>> places) {
    vector<int> answer;
    
    for(int k=0; k<5; k++){
        for(int i=2; i<7;i++){
            for(int j=2; j<7; j++){
                room[i][j] = places[k][i-2][j-2];
            }
        }
        answer.push_back(find());
    }
            
    return answer;
}
Comments