이제 구간 합 문제에 익숙해졌다고 생각했는데 아니었다.. 그래서 2차원 배열의 구간 합을 구하는 방법부터 공부했다.


앞서 배웠던 방법으로 2차원 형식의 구간 합을 먼저 구한다.
그런데 그냥 DP[x][y] 값이 정답이 아니다. 구간 합은 항상 (1, 1)을 포함하는 사각형인데 문제에서 구하는 합들은 아래처럼 매우 다양하다.

그치만 어려운 것 없다. DP에 저장된 값들을 고려하여, 앞의 방법과 비슷하게 아래의 방법으로 빼주고 더해주면 된다.

import sys
input = sys.stdin.readline
N, M = map(int, input().split())
table = []
DP = []
for _ in range(N):
lst = list(map(int, input().split()))
table.append(lst)
#2차원 배열의 누적합 구하기
DP = [[0]*(N+1) for _ in range(N+1)]
for i in range(1, N+1):
for j in range(1, N+1):
DP[i][j] = DP[i-1][j] + DP[i][j-1] + table[i-1][j-1] - DP[i-1][j-1]
for _ in range(M):
x1, y1, x2, y2 = map(int, input().split())
print(DP[x2][y2] - DP[x1-1][y2] - DP[x2][y1-1] + DP[x1-1][y1-1])

재밌었던 문제 ㅎㅎ