[LeetCode] Available Captures for Rook

아르당·약 10시간 전

LeetCode

목록 보기
215/216
post-thumbnail

문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음

Problem

체스판을 나타내는 8 x 8 행렬이 주어진다. 흰색 룩은 R로 표시되고, 흰색 비숍은 B, 검은색 폰은 p로 표시된다. 빈 칸은 .으로 표시된다.

룩은 다른 기물이나 체스판 가장자리에 도달할 때까지 가로 또는 세로(상, 하, 좌, 우)로 원하는 만큼 이동할 수 있다. 룩이 한 번의 이동으로 폰의 칸에 도달할 수 있다면 폰을 공격한다.

흰색 룩이 공격할 수 있는 폰의 개수를 반환해라.

Example

#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에 있는 폰을 공격할 수 있다.

Constraints

  • board.length == 8
  • board[i].length == 8
  • board[i][j]는 R, ., B, p 뿐이다.
  • board[i][j] == R은 정확히 하나 뿐이다.

Solved

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;
    }
}
profile
내 마음대로 코드 작성하는 세상

0개의 댓글