어흥
[해커랭크] Queen's Attack II (C++) 본문
728x90
반응형
문제링크: www.hackerrank.com/challenges/queens-attack-2/problem
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
반응형
'알고리즘 > HackerRank' 카테고리의 다른 글
[해커랭크] Kruskal (MST): Really Special Subtree (C++) (0) | 2020.11.25 |
---|---|
[해커랭크] Breadth First Search: Shortest Reach (C++) (0) | 2020.11.24 |
[해커랭크] Encryption (C++) (0) | 2020.11.23 |
[해커랭크] Roads and Libraries (C++) (0) | 2020.11.20 |
[해커랭크] Forming a Magic Square (C++) (0) | 2020.11.19 |
Comments