문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음
체스판을 나타내는 8 x 8 행렬이 주어진다. 흰색 룩은 R로 표시되고, 흰색 비숍은 B, 검은색 폰은 p로 표시된다. 빈 칸은 .으로 표시된다.
룩은 다른 기물이나 체스판 가장자리에 도달할 때까지 가로 또는 세로(상, 하, 좌, 우)로 원하는 만큼 이동할 수 있다. 룩이 한 번의 이동으로 폰의 칸에 도달할 수 있다면 폰을 공격한다.
흰색 룩이 공격할 수 있는 폰의 개수를 반환해라.
#1
Input: board = [[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".","R",".",".",".","p"],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."]]
Output: 3
Explanation: 이 예제는 룩이 모든 폰을 공격할 수 있다.
#2
Input: board = [[".",".",".",".",".",".","."],[".","p","p","p","p","p",".","."],[".","p","p","B","p","p",".","."],[".","p","B","R","B","p",".","."],[".","p","p","B","p","p",".","."],[".","p","p","p","p","p",".","."],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."]]
Output: 0
Explanation: 비숍이 룩을 막고 있어서 폰을 공격할 수 없다.
#3
Input: board = [[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".","p",".",".",".","."],["p","p",".","R",".","p","B","."],[".",".",".",".",".",".",".","."],[".",".",".","B",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".",".",".",".",".","."]]
Output: 3
Explanation: 룩은 b5, d6, f5에 있는 폰을 공격할 수 있다.
class Solution {
public int numRookCaptures(char[][] board) {
for(int i = 0; i < board.length; i++){
for(int j = 0; j < board[i].length; j++){
if(board[i][j] == 'R'){
return countPawn(board, i, j, 0, 1) +
countPawn(board, i, j, 0, -1) +
countPawn(board, i, j, 1, 0) +
countPawn(board, i, j, -1, 0);
}
}
}
return 0;
}
private int countPawn(char[][] board, int i, int j, int x, int y){
while(i >= 0 && i < board.length && j >= 0 && j < board[i].length && board[i][j] != 'B'){
if(board[i][j] == 'p'){
return 1;
}
i += x;
j += y;
}
return 0;
}
}