티스토리 뷰

https://www.acmicpc.net/problem/11660

 

11660번: 구간 합 구하기 5

첫째 줄에 표의 크기 N과 합을 구해야 하는 횟수 M이 주어진다. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000) 둘째 줄부터 N개의 줄에는 표에 채워져 있는 수가 1행부터 차례대로 주어진다. 다음 M개의 줄에는 네

www.acmicpc.net

 

이 문제는 저번에 풀었던 일차원 배열의 누적합을 구하는 문제인 '구간 합 구하기 4'에서 배열의 차원을 이차원으로 늘린 것이다. 일차원 배열일 때는 단순히 생각할 수 있었는데, 이차원으로 확장하니 무엇을 빼고 더해야 하는지 개념이 잘 안 잡혔다.

책을 펼쳐서 누적합의 개념에 대해 살펴보았다.

sum(y1, x1, y2, x2) = psum[y2][x2] - psum[y2][x1-1] - psum[y1-1][x2] + psum[y1-1][x1-1]

이 식을 통해서 구할 수 있다. 중복되는 부분은 제거하고, 모두에게 포함되는 psum[y1-1][x1-1]은 두 번 빼졌기 때문에 한 번 더해주는 것이다. 이 개념이 잡히고 나니 문제를 푸는데 필요한 수식을 세우는 것은 쉬웠다. 

 

# 구간 합 구하기 5
import sys
input = sys.stdin.readline

N, M = map(int, input().split())
arr = []
for _ in range(N):
    arr.append(list(map(int, input().split())))

dp = [[0 for _ in range(N+1)] for _ in range(N+1)]
dp[1][1] = arr[0][0]
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] - dp[i-1][j-1] + arr[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])

'PS > BOJ Python' 카테고리의 다른 글

9935번 - 문자열 폭발  (0) 2023.06.22
1932번 - 정수 삼각형  (0) 2023.06.10
11722번 - 가장 긴 감소하는 부분 수열  (0) 2023.06.02
1057번 - 토너먼트  (0) 2023.05.25
2003번 - 수들의 합 2  (0) 2023.04.23
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함