728x90
반응형
🔗 문제 링크
https://www.acmicpc.net/problem/11660
11660번: 구간 합 구하기 5
첫째 줄에 표의 크기 N과 합을 구해야 하는 횟수 M이 주어진다. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000) 둘째 줄부터 N개의 줄에는 표에 채워져 있는 수가 1행부터 차례대로 주어진다. 다음 M개의 줄에는 네
www.acmicpc.net
👩💻 코드
#include <iostream>
#include <vector>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
int M;
cin >> N >> M;
vector<vector<int>> A(N + 1, vector<int> (N+1, 0));
vector<vector<int>> D(N + 1, vector<int> (N+1, 0));
for (int i=1; i<=N; i++){
for (int j=1; j<=N; j++){
cin >> A[i][j];
D[i][j] = A[i][j] + D[i][j-1] + D[i-1][j] - D[i-1][j-1];
}
}
for (int i=0; i<M; i++){
int x1;
int y1;
int x2;
int y2;
cin >> x1 >> y1 >> x2 >> y2;
int answer = D[x2][y2] - D[x1-1][y2] - D[x2][y1-1] + D[x1-1][y1-1];
cout << answer << "\n";
}
}
✏️ 풀이
저번 문제에 이어서 구간합을 이용해야 하는 문제였다.
2차원 배열로 확장시켜 생각하려니 어지러웠다...
책에 나와있는대로 배열을 손으로 그려보니 이해가 됐다!
구간합을 구하고자 하는 좌표가 [2,2]라면 자기 자신의 좌표 값 A[2][2]와 이전 열과 행의 구간 합 D[2][1], D[1][2]을 모두 더한 후 중복된 값 D[1][1]을 빼주면 된다.
이 알고리즘을 바탕으로 코드의 첫 번째 for문에서 구간합 2차원 배열을 구했다.
구간합 2차원 배열에서 동일한 알고리즘을 적용하여 문제에서 요구하는 답을 구할 수 있었다.
728x90
반응형
'코딩테스트 > 백준' 카테고리의 다른 글
[백준] 2018번 : 수들의 합 5 (2) | 2024.02.29 |
---|---|
[백준] 10986번 : 나머지 합 (1) | 2024.02.09 |
[백준] 11659번 : 구간 합 구하기 4 (0) | 2024.02.01 |
[백준] 1546번 : 평균 (0) | 2024.02.01 |
[백준] 11720번 : 숫자의 합 (0) | 2024.02.01 |