티스토리 뷰
[ BOJ ] 11660번 : 구간 합 구하기 5
문제 : https://www.acmicpc.net/problem/11660
[ 문제 ]
N×N개의 수가 N×N 크기의 표에 채워져 있다. (x1, y1)부터 (x2, y2)까지 합을 구하는 프로그램을 작성하시오. (x, y)는 x행 y열을 의미한다.
예를 들어, N = 4이고, 표가 아래와 같이 채워져 있는 경우를 살펴보자.
1 | 2 | 3 | 4 |
2 | 3 | 4 | 5 |
3 | 4 | 5 | 6 |
4 | 5 | 6 | 7 |
여기서 (2, 2)부터 (3, 4)까지 합을 구하면 3+4+5+4+5+6 = 27이고, (4, 4)부터 (4, 4)까지 합을 구하면 7이다.
표에 채워져 있는 수와 합을 구하는 연산이 주어졌을 때, 이를 처리하는 프로그램을 작성하시오.
[ 입력 ]
첫째 줄에 표의 크기 N과 합을 구해야 하는 횟수 M이 주어진다. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000) 둘째 줄부터 N개의 줄에는 표에 채워져 있는 수가 1행부터 차례대로 주어진다. 다음 M개의 줄에는 네 개의 정수 x1, y1, x2, y2 가 주어지며, (x1, y1)부터 (x2, y2)의 합을 구해 출력해야 한다. 표에 채워져 있는 수는 1,000보다 작거나 같은 자연수이다. (x1 ≤ x2, y1 ≤ y2)
[ 출력 ]
총 M줄에 걸쳐 (x1, y1)부터 (x2, y2)까지 합을 구해 출력한다.
[ 문제 접근 및 풀이 ]
먼저 (0, 0)부터 (i, j)까지의 누적합 $psum[i][j]$를 각각 구한다.
문제를 이해하기 쉽게 x1= 2, y1=3, x2=4,y=4라고 가정한다면
psum[x2][y2]는 (1, 1)부터 (4, 4)의 합을 가지고 있으며
초록색, 하늘색, 빨간색의 값을 빼주면 된다.
하늘색 영역과 빨간색 영역의 합친 값은 psum[x2][y1-1]이 될 것이며
초록색 영역과 빨간색 영역의 합친 값은 psum[x1-1][y2]가 될 것이다.
또한 빨간색 영역의 값은 psum[x1-1][y1-1]이 되며
노란색 구역의 값은
노랑 = 전체 값 - ( 파랑 + 빨강 ) - ( 초록 + 빨강 ) + 빨강
이를 식으로 나타낸다면
$ psum[x2][y2] - psum[x2][y1-1] - psum[x1-1][y2] + psum[x1-1][y1-1] $이 된다.
[ 소스 코드 ]
#include<bits/stdc++.h>
using namespace std;
int N,M,X1,X2,Y1,Y2;
int board[1025][1025],psum[1025][1025];
void Q_11660();
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
Q_11660();
}
void Q_11660(){
cin >> N >> M;
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++) cin >> board[i][j];
}
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++)
psum[i][j]=board[i][j]+psum[i][j-1]+psum[i-1][j]-psum[i-1][j-1];
}
for(int i=0;i<M;i++){
cin >> X1 >> Y1 >> X2 >> Y2;
cout << psum[X2][Y2] - psum[X2][Y1-1] - psum[X1-1][Y2] + psum[X1-1][Y1-1] <<"\n";
}
}
'BOJ' 카테고리의 다른 글
[ BOJ / C++ ] 2310번 : 어드벤처 게임 (0) | 2025.03.30 |
---|---|
[ BOJ / C++ ] 2206번 : 벽 부수고 이동하기 (1) | 2025.03.23 |
[ BOJ / C++ ] 11729번 : 하노이 탑 이동 순서 (0) | 2025.03.23 |
[ BOJ / C++ ] 20125번 : 쿠키의 신체 측정 (0) | 2025.03.16 |
[ BOJ / C++ ] 1068번 : 트리 (0) | 2025.03.16 |
- Total
- Today
- Yesterday
- 그래프
- BOJ
- dfs
- 시뮬레이션
- 다이나믹 프로그래밍
- 순열 사이클 분할
- stack
- 그리디 알고리즘
- 브루트포스 알고리즘
- 트리를 사용한 집합과 맵
- C++
- 파싱
- 문자열
- 스택
- 해시를 사용한 집합과 맵
- 너비 우선 탐색
- 슬라이딩 윈도우
- 구현
- BFS
- 분할 정복을 이용한 거듭제곱
- 최단 경로
- 자료 구조
- 누적 합
- 깊이 우선 탐색
- 수학
- 플로이드-워셜
- 그래프 탐색
- 백준
- 그래프 이론
- 정렬
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |