안녕하세요. 오늘 풀어볼 문제는 백준 구간합 구하기 5입니다.
https://www.acmicpc.net/problem/11660
이 문제는 구간 합 구하기 4의 심화버전이에요.
수행하는 기능은 간단하지만 테스트 케이스가 1개 이상이기 때문에 dp를 사용해야 합니다.
문제에서는 입력이 2차원 배열으로 주어지는데요,
각 행마다 dp를 적용하면 같은 x 값을 가지는 행들에서의 합을 구할 수 있겠죠.
그 합을 구하는 행의 범위에서 모두 더하면 구간 합을 구할 수 있습니다.

dp 배열은 0번부터 i번까지 원소들의 합으로 정의합니다.
만약 2번부터 5번까지의 합이 알고 싶다면 dp[5] - dp[1]로 구할 수 있어요.
dp[2]가 아닌 dp[1]을 빼는 이유는 dp[2]의 값도 포함되어야 하기 때문입니다.
#include <iostream>
using namespace std;
int N, M;
int input[1025][1025];
int dp[1025][1025];
int main() {
cin.tie(0); ios::sync_with_stdio(0);
cin >> N >> M;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
cin >> input[i][j];
dp[i][j] = input[i][j] + dp[i][j - 1];
}
}
for (int i = 0; i < M; i++) {
int sum = 0;
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
for (int i = x1; i <= x2; i++)
sum += dp[i][y2] - dp[i][y1 - 1];
cout<< sum << '\n';
}
}
도움이 되었다면 하트와 댓글 부탁드립니다.
'Coding Test > Baekjoon' 카테고리의 다른 글
| [C++] 백준 18111: 마인크래프트 (2) | 2025.04.30 |
|---|---|
| [C++] 백준 1874: 스택 수열 (0) | 2025.04.29 |
| [C++] 백준 15663: N과 M (9) (1) | 2025.01.14 |
| [C++] 백준 2630: 색종이 만들기 (0) | 2025.01.12 |
| [C++] 백준 2606: 바이러스 (0) | 2025.01.12 |