※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 2167번 문제인 2차원 배열의 합이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problems/2167
2167번: 2차원 배열의 합
첫째 줄에 배열의 크기 N, M(1 ≤ N, M ≤ 300)이 주어진다. 다음 N개의 줄에는 M개의 정수로 배열이 주어진다. 배열에 포함되어 있는 수는 절댓값이 10,000보다 작거나 같은 정수이다. 그 다음 줄에는
www.acmicpc.net
이 문제는 배열의 합을 구하라는 쿼리를 입력받을 때마다 직접 더해도 제한시간 내로 풀리지만, 2차원 prefix sum을 이용해 풀어보았다.
2차원의 prefix sum을 구하는 점화식은 아래의 코드와 같다.
prefix sum 구하는 점화식: psum[i][j] = arr[i][j] + psum[i][j - 1] + psum[i - 1][j] - psum[i - 1][j - 1]
쿼리 i j x y에 대응되는 값을 계산하는 식: psum[x][y] - psum[i - 1][y] - psum[x][j - 1] + psum[i - 1][j - 1]
아래는 제출한 소스코드이다.
#include <iostream>
#include <string>
using namespace std;
int arr[301][301];
int psum[301][301];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N, M; cin >> N >> M;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
cin >> arr[i][j];
}
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
psum[i][j] = arr[i][j] + psum[i][j - 1] + psum[i - 1][j] - psum[i - 1][j - 1];
}
}
int K; cin >> K;
string ans = "";
while (K--) {
int i, j, x, y; cin >> i >> j >> x >> y;
ans += to_string(psum[x][y] - psum[i - 1][y] - psum[x][j - 1] + psum[i - 1][j - 1]) + "\n";
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 10995 // C++] 별 찍기 - 20 (0) | 2021.06.01 |
---|---|
[BOJ 1000 // C++] A+B (0) | 2021.06.01 |
[BOJ 1913 // C++] 달팽이 (0) | 2021.05.31 |
[BOJ 1021 // C++] 회전하는 큐 (0) | 2021.05.30 |
[BOJ 1912 // C++] 연속합 (0) | 2021.05.29 |