반응형
https://www.acmicpc.net/problem/16507
2차원 누적합 문제였습니다.
📕 풀이방법
📔 입력 및 초기화
r(행), c(열), q(질의 개수), board(입력받을 2차원 배열), sum(누적합을 저장할 2차원 배열) 을 선언합니다.적절히 입력받습니다.
📔 풀이과정
1. 가로방향으로 구간합을 구해줍니다. 첫 번째 열에는 그냥 board의 값이 저장됩니다.
2. 세로방향으로 구간합을 구해줍니다. 첫 번째 행에도 그냥 board의 값이 저장됩니다.
📔 정답출력
q만큼 r1, c1, r2, c2를 입력받고 구간에 대한 합을 O(1)만에 출력합니다.
📕 Code
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll r, c, q, board[1001][1001], sum[1001][1001];
int main(){
cin >> r >> c >> q;
for(int i = 1; i <= r; i++){
for(int j = 1; j <= c; j++){
cin >> board[i][j];
}
}
//가로 방향으로 구간합
for(int i = 1; i <= r; i++){
for(int j = 1; j <= c; j++){
sum[i][j] = sum[i][j-1] + board[i][j];
}
}
//세로 방향으로 구간합
for(int i = 1; i <= c; i++){
for(int j = 1; j <= r; j++){
sum[j][i] = sum[j-1][i] + sum[j][i];
}
}
while(q--){
int r1, c1, r2, c2;
cin >> r1 >> c1 >> r2 >> c2;
cout << (sum[r2][c2] - sum[r1-1][c2] - sum[r2][c1-1] + sum[r1-1][c1-1]) / ((r2 - r1 + 1) * (c2- c1 + 1)) << '\n';
}
}
'Algorithm > DP(Dynamic Programing)' 카테고리의 다른 글
(C++) - 백준(BOJ) 20500 : Ezreal 여눈부터 가네 ㅈㅈ (0) | 2022.01.24 |
---|---|
(C++) - 백준(BOJ) 17831 : 대기업 승범이네 (0) | 2021.10.22 |
(C++) - 백준(BOJ) 2098 : 외판원 순회 (0) | 2021.10.04 |
(C++) - 백준(BOJ) 17485~6번 : 진우의 달 여행 (Small, Large) (0) | 2021.09.23 |
(C++) - 백준(BOJ) 1823번 : 수확, 13002번 : Happy Cow (0) | 2021.09.21 |