본문 바로가기
알고리즘 이전/do it 알고리즘 코딩테스트

11660 구간 합 구하기 5

by hoshi03 2023. 10. 12.

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

 

11660번: 구간 합 구하기 5

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

www.acmicpc.net

 

아까 개념을 2차원 배열에 적용시켜서 푸는 문제다

그림을 그리면 이해가 잘 되고

구간합 sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1] + arr[i][j];

범위로 구간합을 구할때 (x1,y1) (x2,y2) 두 좌표의 범위의 구간값은

sum[x2][y2] - sum[x1-1][y2] - sum[x2][y1-1] + sum[x1-1][y1-1] 이다!

import java.util.*;
class Main {

    public static void main(String[] args) {
        Main T = new Main();
        Scanner in =  new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        int[][] arr = new int[n+1][n+1];
        for (int i = 1; i <= n; i++){
            for (int j = 1; j <= n; j++){
                arr[i][j] = in.nextInt();
            }
        }
        int[] res = new int[m];
        int[][] sum = new int[n+1][n+1];

        //구간합 구하기
        for (int i = 1; i <= n; i++){
            for (int j = 1; j <= n; j++){
                sum[i][j] = sum[i][j-1] + sum[i-1][j] - sum[i-1][j-1] + arr[i][j];
            }
        }

        // 구간합 구하기 (x1,y1) (x2,y2)가 있을때를 그림으로 그려보면 이해가 된다
        for (int i = 0; i < m; i++){
            int x1 = in.nextInt();
            int y1 = in.nextInt();
            int x2 = in.nextInt();
            int y2 = in.nextInt();
            res[i] = sum[x2][y2] - sum[x1-1][y2] - sum[x2][y1-1] + sum[x1-1][y1-1];
        }

        for (int x : res) System.out.println(x);
    }
}

 

'알고리즘 이전 > do it 알고리즘 코딩테스트' 카테고리의 다른 글

11659 구간 합 구하기  (0) 2023.10.12