Number of Submatrices That Sum to Target
row = len(matrix[0])
columns = len(matrix)
for r in matrix:
for x in range(row - 1):
r[x+1] += r[x] #각 row에 대한 누적합
res = 0
for start in range(row):
for end in range(start,row):
count = collections.defaultdict(int)
current = 0
count[0] = 1
for column in range(columns):
current += matrix[column][end] - (matrix[column][start - 1] if start > 0 else 0)
res += count[current - target]
count[current] += 1
다음 코드를 보고 한 번에 이해를 안되는 사람들을 위해 설명을 하려한다.
for r in matrix:
for x in range(row - 1):
r[x+1] += r[x] #각 row에 대한 구간합
이중반복문으로 나중에 쓸 각 행의 구간합을 미리 구해놓는다.
for start in range(row):
for end in range(start,row):
count = collections.defaultdict(int)
current = 0
count[0] = 1
for column in range(columns):
current += matrix[column][end] - (matrix[column][start - 1] if start > 0 else 0)
res += count[current - target]
count[current] += 1
이 삼중 반복문에서 무슨일이 일어 나는지 알아보기 위해 i=1,j=3이라고 가정해보자.
그리고 크게 두가지 부분으로 나누어서 볼 것이다.
count = collections.defaultdict(int)
count[0] = 1
for column in range(columns):
current += matrix[column][end] - (matrix[column][start - 1] if start > 0 else 0)
res += count[current - target]
count[current] += 1
다음으로 우리가 실제로 첫 번째 행부터 matrix[0][1...3], matrix[1][1...3] ... matrix[m-1][1...3] 로우별로 각 구간합을 더한다. res에 값을 구하는 방법은 구간합을 이용한 Subarray Sum Equals K 이 문제와 똑같다. 여기서 따로 설명하진 않겠다.