Leetcode Java Available Captures for Rook
업데이트:
문제
코드
class Solution {
private int[][] directions = new int[][] {
{ 0, 1 },
{ 1, 0 },
{ 0, -1 },
{ -1, 0 }
};
public int numRookCaptures(char[][] board) {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (board[i][j] == 'R') {
return this.numRookCaptures(board, i, j, directions[0])
+ this.numRookCaptures(board, i, j, directions[1])
+ this.numRookCaptures(board, i, j, directions[2])
+ this.numRookCaptures(board, i, j, directions[3]);
}
}
}
return 0;
}
private int numRookCaptures(char[][] board, int x, int y, int[] direction) {
while (x >= 0 && x < 8 && y >= 0 && y < 8 && board[x][y] != 'B') {
if (board[x][y] == 'p') {
return 1;
} else {
x += direction[0];
y += direction[1];
}
}
return 0;
}
}
결과
설명
- $8 \times 8$ 크기의 체스판에서 아래의 체스말들로 흰 룩이 잡을 수 있는 검정색 폰의 갯수를 구하는 문제이다.
- 체스판의 각 공간의 값은 아래와 같다.
- ‘R’은 흰색 룩을 의미한다.
- ‘B’는 흰색 비숍을 의미한다.
- ‘p’는 검정색 폰을 의미한다.
- ’.’은 빈 공간을 의미한다.
- 룩은 네 방향(북, 동, 남, 서) 중 하나의 방향으로 원하는 횟수만큼 이동이 가능하며, 아래의 경우 멈춘다.
- 체스판의 끝인 경우.
- 검정색 폰을 잡은 경우.
- 흰색 비숍이 앞에 있는 경우.
- 체스판의 각 공간의 값은 아래와 같다.
-
전역 변수인 directions는 룩의 이동 방향을 저장할 변수로, 북동남서 순으로 [x, y] 좌표를 넣어 초기화한다.
- 0부터 8미만까지 i를, 0부터 8미만까지 y를 증가시키며 아래를 반복한다.
- board[i][j]가 ‘R’인 흰색 룩인 경우, 4번에서 정의한 numRookCaptures(char[][] board, int x, int y, int[] direction) 메서드를 수행한 결과를 directions의 순서대로 수행한 결과의 합을 주어진 문제의 결과로 반환한다.
- 주어진 좌표인 [x, y]에서 이동 방향인 direction을 이동하며 잡을 수 있는 검정색 폰을 탐색하기 위한 numRookCaptures(char[][] board, int x, int y, int[] direction) 메서드를 정의한다.
- x와 y가 0 ~ 7 범위 내까지 board[x][y]가 ‘B’인 흰색 비숍이 아닌 경우일 때까지 아래를 반복한다.
- board[x][y]가 ‘p’인 검정색 폰인 경우, 잡은 횟수인 1을 반환한다.
- 위의 경우가 아니라면 direction 방향으로 x와 y를 더한다.
- x와 y가 0 ~ 7 범위 내까지 board[x][y]가 ‘B’인 흰색 비숍이 아닌 경우일 때까지 아래를 반복한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기