2D 이진 행렬이 있다고 가정하고 모두 1인 정사각형 부분행렬의 총 수를 찾아야 합니다.
따라서 입력이 다음과 같으면
1 | 1 | 1 | 0 |
1 | 1 | 1 | 0 |
1 | 1 | 1 | 0 |
0 | 0 | 0 | 0 |
1 | 0 | 1 | 1 |
12(1 x 1) 정사각형, 4(2 x 2) 정사각형 및 1(3 x 3) 정사각형이 있으므로 출력은 17이 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- res :=0
- 행렬의 행 수까지 범위 0에 있는 i에 대해
- 행렬의 열 개수까지 범위 0에 있는 j의 경우 수행
- i가 0과 같거나 j가 0과 같으면
- res :=res + 행렬[i, j]
- 그렇지 않으면 행렬[i, j]가 1과 같을 때
- 행렬[i, j] =(행렬[i, j - 1], 행렬[i - 1, j] 및 행렬[i - 1, j - 1]) + 1의 최소값
- res :=res + 행렬[i, j]
- i가 0과 같거나 j가 0과 같으면
- 행렬의 열 개수까지 범위 0에 있는 j의 경우 수행
- 반환 결과
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
class Solution: def solve(self, matrix): res = 0 for i in range(len(matrix)): for j in range(len(matrix[0])): if i == 0 or j == 0: res += matrix[i][j] elif matrix[i][j] == 1: matrix[i][j] = min(matrix[i][j - 1], matrix[i - 1][j], matrix[i - 1][j - 1]) + 1 res += matrix[i][j] return res ob = Solution() matrix = [ [1, 1, 1, 0], [1, 1, 1, 0], [1, 1, 1, 0], [0, 0, 0, 0], [1, 0, 1, 1] ] print(ob.solve(matrix))
입력
matrix = [ [1, 1, 1, 0], [1, 1, 1, 0], [1, 1, 1, 0], [0, 0, 0, 0], [1, 0, 1, 1] ]
출력
17