less than 1 minute read

11660 구간 합 구하기 5 (c++)

문제

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

접근 방식

누적 합
누적합([startY][startX] -> [endY][endX]) = 누적합 [endY][endX] - 누적합[startY-1][endX] - 누적합[endY][startX-1] + 누적합[startY-1][startX-1]

image

문제 풀이

#include <iostream>
#define endl '\n'
using namespace std;

int N, M, sum, num, startY, startX, endY, endX, sumArr[1025][1025] = {};
int main()
{
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> N >> M;
    for (int i = 1; i <= N; ++i)
    {
        sum = 0;
        for (int j = 1; j <= N; ++j)
        {
            cin >> num;
            sum += num;
            sumArr[i][j] = sum + sumArr[i - 1][j];
        }
    }
    while (M-- > 0)
    {
        cin >> startY >> startX >> endY >> endX;
        cout << sumArr[endY][endX] - sumArr[startY - 1][endX] - sumArr[endY][startX - 1] + sumArr[startY - 1][startX - 1] << endl;
    }

    return 0;
}

다시 생각해 볼 점

  1. 변수는 시작부분에 한줄로 쭉 선언하는게, 필요한 부분마다 선언하는 것보다 시간 효율이 더 좋다.
  2. iostream 헤더를 쓰고, sync_with_stdio, cin.tie, cout.tie 설정을 해주는게, cstdio 에서 scanf, printf를 쓰는 것보다 시간 효율이 더 좋다.