알고리즘/PS

[C++] 백준 11660 : 구간 합 구하기 5

BigmacGood 2022. 4. 12. 20:25

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

 

11660번: 구간 합 구하기 5

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

www.acmicpc.net

백준 11660번 구간 합 구하기 5를 풀었다.

 

2차원 배열에서 구간 합을 구하는 문제다. 행 별로 누적 합을 구한 뒤에 각 행마다 구간 합 연산을 해주면 된다.

  1 2 3 4
1 1 2 3 4
2 2 3 4 5
3 3 4 5 6
4 4 5 6 7

처음 입력 받은 배열이다. 0번째 index는 생략했다.

 

행 별로 누적 합 연산을 해보면 아래 표처럼 바뀐다.

  1 2 3 4
1 1 3 6 10
2 2 5 9 14
3 3 7 12 18
4 4 9 15 22

문제 예제처럼 (2, 2)에서 (3, 4)를 구하려면 빨간 배경의 누적 합을 행 별로 구하면 된다.

2행의 누적 합 값은 (2, 4)의 값인 14에서 (2, 1)의 값인 2를 뺀 12이다.

3행의 누적 합 값은 (3, 4)의 값인 18에서 (3, 1)의 값인 3을 뺀 15이다.

이 둘을 합친 것이 정답이 된다.

 

아래는 전체 코드입니다.

#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;

int N, M;
int arr[1025][1025];

int main() {
	cin >> N >> M;

	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			scanf_s("%d", &arr[i][j]);
		}
	}

	for (int i = 1; i <= N; i++) {
		for (int j = 2; j <= N; j++) {
			arr[i][j] += arr[i][j - 1];
		}
	}

	while (M--) {
		int x1, y1, x2, y2;
		int sum = 0;
		scanf_s("%d %d %d %d", &x1, &y1, &x2, &y2);
		for (int i = 0; i < x2 - x1 + 1; i++) {
			sum += arr[x1 + i][y2] - arr[x1 + i][y1 - 1];
		}
		printf_s("%d\n", sum);
	}

	return 0;
}

 

'알고리즘 > PS' 카테고리의 다른 글

[C++] 백준 11403 : 경로 찾기  (0) 2022.04.14
[C++] 백준 3020 : 개똥벌레  (0) 2022.04.13
[C++] 백준 11659 : 구간 합 구하기 4  (0) 2022.04.11
[C++] 백준 9251 : LCS  (0) 2022.04.10
[C++] 백준 2565 : 전깃줄  (0) 2022.04.09