[Algorithm] 누적합(Prefix sum)을 이용한 구간합 구하기

2023. 6. 28. 14:13·🍞 Algorithm

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

 

11659번: 구간 합 구하기 4

첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j

www.acmicpc.net

 

✅ 누적합이란?

x0, x1... xn까지 수가 있을 때 y0 = x0, y1 = x0 + x1, yn = x0 + x1 +... + xn처럼 해당 n까지의 합을 의미한다.

y0 = x0
y1 = x0 + x1
y2 = x0 + x1 + x2
...
yN = x0 + x1 + ... + xN

 

✅  누적합의 성질

i부터 j의 합을 구하려면 누적합 j에서 누적합 i - 1을 빼주면 된다. 

S[j] - S[i-1] = a[i] + a[i+1] + ... + a[j-1] + a[j]

 

누적합 알고리즘 O(n)

 

매번 요청이 들어올 때마다 합을 구하는 방법O(n^2)도 있지만,

누적합을 이용해 미리 요청이 들어올 때마다 구해놓은 preSum 배열을 이용해 값을 바로 반환한다.

 

즉, `5 4 3 2 1`로 예제가 주어진다면 다음과 같이 값이 할당될 것이다.

preSum[1] = 5

preSum[2] = 9

preSum[3] = 12

preSum[4] = 14

preSum[5] = 1

 

ex) 2에서 4 부분합을 구하고 싶다면?

preSum[4] - preSum[2 - 1] = 9 

#include <algorithm>
#include <iostream>
using namespace std;

int N, M, num;
int x, y, preSum[100001];

int main() {
	cin >> N >> M;
	for (int i = 1; i <= N; i++) {
		cin >> num;
		preSum[i] = preSum[i - 1] + num;
	}

	for(int i = 0; i < M; i++){
		cin >> x >> y;

		if (x == 0) {
			cout << preSum[y] << "\n";
		}
		else {
			cout << preSum[y] - preSum[x - 1] << "\n";
		}
	}
}
저작자표시 (새창열림)

'🍞 Algorithm' 카테고리의 다른 글

[백준] 17406 배열 돌리기4 java  (0) 2025.01.20
[Algorithm] 2차원 누적합  (0) 2024.10.23
[Algorithm] DP 배낭 채우기 (Knapsack)  (0) 2024.10.22
[Softeer] Softeer 출퇴근길 c++  (0) 2024.09.03
'🍞 Algorithm' 카테고리의 다른 글
  • [백준] 17406 배열 돌리기4 java
  • [Algorithm] 2차원 누적합
  • [Algorithm] DP 배낭 채우기 (Knapsack)
  • [Softeer] Softeer 출퇴근길 c++
박빵이
박빵이
2025년에도 갓생살기
  • 박빵이
    기억보다 기록
    박빵이
  • 전체
    오늘
    어제
    • 분류 전체보기 (337)
      • 🍞 FrontEnd (97)
        • HTML+CSS (4)
        • JavaScript (17)
        • TypeScript (4)
        • React (52)
        • Next.js (2)
        • Android (15)
      • 🍞 BackEnd (24)
        • Java (15)
        • Node.js (6)
        • Spring (1)
      • 🍞 Cloud & Infra (0)
        • AWS SAA (0)
        • Microsoft Azure (0)
      • 🍞 Algorithm (147)
        • C++ (4)
        • Baekjoon (41)
        • Programmers (97)
      • 🍞 Computer Science (18)
        • 운영체제 (1)
        • 데이터 통신 (6)
        • 네트워크 (6)
        • 데이터베이스 (1)
      • 🍞 대외활동 & 부트캠프 (42)
        • 삼성 청년 SW 아카데미 (1)
        • LG유플러스 유레카 (0)
        • 한국대학생IT경영학회 (1)
        • IT연합동아리 UMC (17)
        • 길벗 블로깅 멘토 (18)
        • IT연합동아리 피로그래밍 (3)
        • 개발 컨퍼런스 (2)
  • 블로그 메뉴

    • Admin
  • 링크

    • GitHub
  • 인기 글

  • 태그

    길벗 블로깅 멘토
    코딩자율학습
    코틀린
    안드로이드
    알고리즘
    level1
    백준
    C++
    umc
    JavaScript
    유니온파인드
    level2
    map
    프로그래머스
    Android
    위상정렬
    Java
    길벗 블로깅 멘토링
    Front
    react
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
박빵이
[Algorithm] 누적합(Prefix sum)을 이용한 구간합 구하기
상단으로

티스토리툴바