2D 보드가 있다고 가정하고 그 안에 있는 전함의 수를 계산해야 합니다. 전함은 'X' 기호로 표시되고 빈 슬롯은 '.'로 표시됩니다. 우리는 다음 규칙을 가정할 수 있습니다 -
-
전함이나 빈 슬롯으로만 구성된 유효한 보드를 받습니다.
-
전함은 가로 또는 세로로만 배치할 수 있습니다. 즉, 1xN(1행, N열) 또는 Nx1(N행, 1열) 모양으로만 만들 수 있으며, 여기서 N은 임의의 크기일 수 있습니다.
-
최소 하나의 수평 또는 수직 셀이 두 전함 사이를 분리합니다. 인접한 전함이 없습니다.
따라서 보드가 다음과 같은 경우:
X | . | . | X |
. | . | . | X |
. | . | . | X |
그러면 두 척의 전함이 있으므로 출력은 2가 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
ans :=0, n :=행 개수 및 m :=열 개수
-
i번째 행에 대해
-
j번째 열에 대해
-
board[i, j]가 점이면 다음 반복으로 이동합니다.
-
i> 0이고 board[i – 1, j] ='X'이면 다음 반복으로 이동합니다.
-
j> 0이고 board[i, j - 1] ='X'이면 다음 반복으로 이동합니다.
-
1만큼 증가
-
-
-
반환
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#include <bits/stdc++.h> using namespace std; class Solution { public: int countBattleships(vector<vector<char>>& board) { int ans = 0; int n = board.size(); int m = board[0].size(); for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ if(board[i][j] == '.')continue; if(i > 0 && board[i - 1][j] == 'X')continue; if(j > 0 && board[i][j - 1] == 'X')continue; ans++; } } return ans; } }; main(){ vector<vector<char>> v = {{'X','.','.','X'},{'.','.','.','X'},{'.','.','.','X'}}; Solution ob; cout << (ob.countBattleships(v)); }
입력
[["X",".",".","X"],[".",".",".","X"],[".",".",".","X"]]
출력
2