Leetcode Java Queens That Can Attack the King
업데이트:
문제
코드
class Solution {
private static final int[][] DIRECTIONS = {
{ -1, -1 },
{ 0, -1 },
{ 1, -1 },
{ 1, 0 },
{ 1, 1 },
{ 0, 1 },
{ -1, 1 },
{ -1, 0 }
};
public List<List<Integer>> queensAttacktheKing(int[][] queens, int[] king) {
boolean[][] visited = new boolean[8][8];
for (int[] queen : queens) {
visited[queen[0]][queen[1]] = true;
}
List<List<Integer>> result = new ArrayList<>();
for (int[] direction : DIRECTIONS) {
for (int x = king[0] + direction[0], y = king[1] + direction[1];
0 <= x && x < 8 && 0 <= y && y < 8; x += direction[0], y += direction[1]) {
if (visited[x][y]) {
result.add(Arrays.asList(x, y));
break;
}
}
}
return result;
}
}
결과
설명
-
$8 \times 8$ 크기의 체스판에서 queens 위치의 여왕들과 king 위치의 왕이 존재할 때, 왕을 직접 공격할 수 있는 여왕의 좌표를 반환하는 문제이다.
- 문제 풀이에 필요한 변수를 정의한다.
- DIRECTIONS은 여왕이 움직일 수 있는 8방면 좌표를 저장한 전역 변수로, 현재 위치에서 각 방면으로 이동하기 위한 x와 y축 이동 값을 저장한다.
- visited는 여왕과 만날 수 있는 위치를 저장할 변수로, $8 \times 8$ 크기의 정수 배열로 초기화하여 queens의 각 위치에 true를 넣어 표시해준다.
- result는 만날 수 있는 여왕 위치를 저장할 변수로, ArrayList로 초기화한다.
- DIRECTIONS의 각 값을 direction에 순차적으로 넣어 아래를 수행한다.
- x는 $king[0] + direction[0]$, y는 $king[1] + direction[1]$로 초기화하여 체스 판 위에서 움직일 수 있을 때 까지 x에 direction[0]을, y에 direction[1]을 더하면서 아래를 반복한다.
- visited[x][y]의 값이 true인 여왕과 만나는 경우, result에 해당 위치를 넣고 다음 위치의 여왕들은 해당 위치의 여왕에 막혀 공격이 불가능하므로 현재 반복을 중지한다.
- x는 $king[0] + direction[0]$, y는 $king[1] + direction[1]$로 초기화하여 체스 판 위에서 움직일 수 있을 때 까지 x에 direction[0]을, y에 direction[1]을 더하면서 아래를 반복한다.
- 반복이 완료되면 결과가 저장된 result를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기