2024. 6. 9. 22:28ㆍ개발의 흔적/코딩테스트
https://leetcode.com/problems/count-square-submatrices-with-all-ones/submissions/1282854201/

결국 정사각형의 크기가 얼마나되는지에 대한 정보는 한 cell에만 저장되면 된다.
[1, 1]
[1, 1] 이라면 이 정사각형의 크기는 2인데, 이를 기록하는 것은 한 번 이다.
그런데 그 크기 정보를 가장 오른쪽, 아래 모서리에 표시하게 된다면,
[1, 1]
[1, 2] 이렇게 표시가 되는것이고 이들을 다 더한 값인 5는 length=1인 정사각형 4개, length=2인 정사각형 1개의 의미와 동일해진다.
[1, 1, 1] [1,1,1]
[1, 1, 1] [1,2,2]
[1, 1, 1] -> [1,2,3] 이런식으로..
즉, [a, b]
[c, d] 일때, d값은 a,b 그리고 c가 모두 1일때만 하나 더 커진다.
위 논리로 모든 정사각형의 개수를 결국 그래프의 크기만큼의 시간복잡도로 구할 수 있고 O(m*n) = 300 * 300 = 90,000
한 값이 이전의 값들로 인해 결정된다 ---> dp
어떤 순서로 그래프를 탐색해야, 이전 값들의 값이 반영된 상태에서 값을 제대로 구할 수 있을까라는 쓸데없는 고민을 했다.
결국 세로, 가로에 대해 순차적으로 값을 넣으면 (이중 for문으로), graph[a][b]의 값을 넣을때 이미 a와 b보다 값이 작은 cell들은 모두 제 값이 반영된다.
위 고민때문에 머리 아파서 결국 gpt를 사용했는데,
쳐보고나서 바로 후회했다... 조금만 더 생각하면 스스로 풀 수 있는데 ㅠㅠ
from typing import List
class Solution:
def countSquares(self, matrix: List[List[int]]) -> int:
max_length = max(len(matrix), len(matrix[0]))
max_square = [[0]*len(matrix[0]) for _ in range(len(matrix))]
total_square = 0
for j in range(len(matrix)):
for i in range(len(matrix[0])):
if matrix[j][i] == 1:
if j == 0 or i == 0:
max_square[j][i] = 1
else:
max_square[j][i] = 1
max_square[j][i] += min(max_square[j-1][i], max_square[j][i-1], max_square[j-1][i-1])
total_square += max_square[j][i]
return total_square
'개발의 흔적 > 코딩테스트' 카테고리의 다른 글
| [구현] (2-2) 자료구조의 원하는 구간만 sorting하기 (0) | 2024.06.11 |
|---|---|
| [구현] (2-1) 약수 구할때에 시간복잡도 줄이기 (1) | 2024.06.11 |
| [bfs] deque로 treenode의 값 뒤바꾸기 (0) | 2024.06.03 |
| [dfs] dfs(recursion) vs permutations : 시간복잡도의 관점에서 무엇을 선택 할 것인가 (0) | 2024.05.30 |
| [완전탐색] 문제에서 '완전탐색일 수 밖에 없는 이유' 찾기 (0) | 2024.05.29 |