DP를 사용해서 2차원 배열의 구간합을 구하는 문제이다.

먼저 각 row 별로 col이 1에서부터 index 까지의 구간합을 구한다.

(x1, y1) (x2, y2) 가 입력되면 구한 구간합의 차를 이용하여 (x1, y1) (x1, y2) 를 구하여 x1 부터 x2 까지 반복하면 된다.

 

문제링크 :  11660번: 구간 합 구하기 5 (acmicpc.net)

#include <iostream>
#include <vector>

using namespace std;

int main() {

	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	int N, M;
	cin >> N >> M;

	vector<vector<int>> map(N + 1, vector<int>(N + 1, 0));
	vector<vector<int>> sum(N + 1, vector<int>(N + 1, 0));

	for (int i = 1; i <= N; i++)
		for (int j = 1; j <= N; j++)
			cin >> map[i][j];

	for (int i = 1; i <= N; i++)
		for (int j = 1; j <= N; j++)
			sum[i][j] = sum[i][j - 1] + map[i][j];

	for (int i = 0; i < M; i++)
	{
		int x1, x2, y1, y2;
		int total = 0;

		cin >> x1 >> y1 >> x2 >> y2;

		for (int j = x1; j <= x2; j++)
			total += sum[j][y2] - sum[j][y1 - 1];

		cout << total << '\n';
	}

	return 0;
}

'Coding_Test 연습 > Baekjoon Online Judge' 카테고리의 다른 글

[BOJ] (C++) 9655 돌 게임  (0) 2022.09.08
[BOJ] (C++) 1309 동물원  (0) 2022.09.07
[BOJ] (C++) 2225 합분해  (0) 2022.09.05
[BOJ] (C++) 1520 내리막 길  (0) 2022.04.08
[BOJ] (C++) 11048 이동하기  (0) 2022.04.07

+ Recent posts