반응형
구간 합이란?
연속된 숫자들의 배열에서, 원하는 구간까지의 합을 알고자 할 때 이용하는 알고리즘.
ex) 1 ~ 10이 배열에 저장되어있다고 할 때, 합 배열은 1 3 6 10 ..과 같은 방식
합 배열에서의 1 = 1 / 3 = 1+2 / 6 = 1+2+3 / 10 = 1+2+3+4
if) 난 3 ~ 6의 합에 대해 알고 싶은데 어떻게 해야하나요?
answer) 1 ~ 6의 합에서 1 ~ 2의 합을 뺀다면, 원하는 답을 얻울 수 있어요!
공식
합 배열 S의 정의
S[i] = A[0] + A[1] + A[2] + ... + A[i-1] + A[i] (A[0]부터 A[i]까지의 합)
합 배열 S를 만드는 공식
S[i] = S[i-1] + A[i] (더하고자 하는 A[i]를, 이전까지의 합S[i-1]의 합)
구간 합을 구하는 공식
S[j] - S[i-1] (i에서 j까지의 구간 합)
11659번: 구간 합 구하기 4
첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j
www.acmicpc.net
위의 개념을 숙지하고 이를 적용하기 매우 좋은 문제이다.
말 그대로 구간합 내용을 사용하는 것이 포인트.
C++ 풀이
#include <iostream>
#include <vector>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int N, M;
cin >> N >> M;
vector<int> vec(N);
vector<int> sum = { 0 };
for (int i = 0; i < N; i++) {
cin >> vec[i];
}
for (int i = 0; i < vec.size(); i++) {
int hap = 0;
hap = sum[i] + vec[i];
sum.push_back(hap);
} // 합 배열 공식 사용
for (int i = 0; i < M; i++) {
int x, y;
cin >> x >> y;
cout << sum[y] - sum[x - 1] << '\n';
} // 구간 합 공식 시용
return 0;
}
코드 리뷰는 언제나 환영.
'알고리즘' 카테고리의 다른 글
백준 1940번 주몽 (c++) (0) | 2023.09.02 |
---|---|
백준 2018번 수들의 합5 (C++) (0) | 2023.08.29 |
백준 10986번 나머지 합 (C++) (0) | 2023.08.29 |
백준 11660번 구간 합 구하기5 (C++) (1) | 2023.08.28 |
배열(array) vs 리스트(list) (0) | 2023.08.28 |