본문 바로가기

코딩테스트/백준

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

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