어흥

[해커랭크] Queen's Attack II (C++) 본문

알고리즘/HackerRank

[해커랭크] Queen's Attack II (C++)

라이언납시오 2020. 11. 23. 14:41
728x90
반응형

문제링크: www.hackerrank.com/challenges/queens-attack-2/problem

 

Queen's Attack II | HackerRank

Find the number of squares the queen can attack.

www.hackerrank.com

1. 주의할 점

- 8방에서 가장 가까운 장애물을 미리 구해놓는다(1칸씩 옆으로 가면서 확인하지말것)

- 대각선을 잘 세도록 한다

 

2. 구현

- 변수 U,RU,R,RD,D,LD,L,LU를 둬서 12시부터 시계방향으로 8방향에서 가장 가까운 장애물의 Y좌표를 저장하도록 한다

- 대각선의 경우, Y좌표를 변수에 저장했기 때문에 퀸과 벽사이의 거리와 변수의 값중에서 작은 값을 저장하도록 한다. 왜냐하면 천장이나 바닥에 닿기전에 옆쪽의 면에 부딪힐수도 있기 때문이다 (문제의 Input1번에서 5시방향으로 뻗는 경우)

- 구한값들을 전부 더한다

// Complete the queensAttack function below.
int queensAttack(int n, int k, int r_q, int c_q, vector<vector<int>> obstacles) {
    int cnt=0,r=n+1,l=0,ru=n+1,rd=0,ld=0,lu=n+1,u=n+1,d=0;      //대각선은 y기준
    for(int i=0;i<obstacles.size();i++){
        int y = obstacles[i][0];
        int x = obstacles[i][1];
        if(y==r_q){     //높이가 같은 경우
            if(x>c_q)       //오른쪽
                r = min(r, x);
            else
                l = max(l, x);
        }
        else if(x==c_q){        //세로가 같은경우
            if(y>r_q)   //위
                u = min(u,y);
            else        //아래
                d = max(d, y);
        }
        else if(r_q + c_q==x+y){        //11->5시 방향
            if(y>r_q)       //11시
                lu = min(lu, y);
            else
                rd = max(rd, y);
        }
        else if(r_q - c_q == y - x){        //1 -> 7시 방향
            if(y>r_q)       //1시
                ru = min(ru, y);
            else
                ld = max(ld, y);
        }
    }
    //가로
    cnt += (r - c_q - 1);
    cnt += (c_q - l - 1);
    //세로
    cnt += (u - r_q - 1);
    cnt += (r_q - d - 1);
    //대각선
    
    cnt += min(c_q - 1, lu - r_q - 1);
    cnt += min(c_q - 1, r_q - ld - 1);
    cnt += min(n - c_q, r_q - rd - 1);    
    cnt += min(n - c_q, ru - r_q - 1);
    return cnt;
}
728x90
반응형
Comments