728x90
문제 풀이 순서는 아래와 같다.
1. 데이터의 개수 N과 질의 개수 M 입력
2. 구간 합을 구할 대상 배열 입력
3. 구간 i,j 입력
4. 출력
이전 글에 구간 합에 대한 내용을 정리했으니
참고하길 바란다.
https://binaryroot.tistory.com/17
[자료구조] 구간 합
구간 합은 합 배열이라는 것을 이용하여 시간 복잡도를 줄이는 알고리즘이다.코딩 테스트에서는 사용 빈도가 높다고 한다. 핵심 이론구간 합 알고리즘을 활용하려면 먼저 합 배열을 구해야 한
binaryroot.tistory.com
글을 확인했다면, 풀이를 시작해보자.
N과 M 입력
int n,m;
cin >> n >> m;
배열은 100000를 넘을 수 없으니
const로 미리 선언해주기
const int NMAX = 100020;
int arr[NMAX];
그리고 입력하기
처음부터 구간 합 공식에 넣고, 구간 합을 구해놓는다면
시간 복잡도는 줄어들 것이다.
for(int i = 1; i <= n; i++){
cin >> arr[i];
prefixSum[i] = prefixSum[i-1] + arr[i];
}
이제 구간 합을 구하여 계산해보자.
int a,b;
for(int i = 0; i < m; i++){
cin >> a >> b;
cout << prefixSum[b] - prefixSum[a-1] << '\n';
}
- 위에서 입력한 M개의 쿼리에 대해 a~b 구간의 합을 출력한다.
- prefixSum[b] - prefixSum[a-1]를 통하여 arr[a]부터 arr[b]까지의 합을 O(1)로 계산 가능하다.
전체 코드
#include <iostream>
//구간 합 구하기4
using namespace std;
typedef long long ll;
const int NMAX = 100020;
int arr[NMAX];
ll prefixSum[NMAX];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n,m;
cin >> n >> m;
for(int i = 1; i <= n; i++){
cin >> arr[i];
prefixSum[i] = prefixSum[i-1] + arr[i];
}
int a,b;
for(int i = 0; i < m; i++){
cin >> a >> b;
cout << prefixSum[b] - prefixSum[a-1] << '\n';
}
}
실버3의 문제였다.
구간 합에 대한 기본적인 지식이 없다면 풀 수 없는 문제이지 않을까 싶다.
해당 개념을 공부하지 않은 상태였다면 나는 과연 이 문제를 풀 수 있었을까?
아마.. 없었을 것 같다.
정확하게 알고 문제를 많이 풀어보자.
더 좋은 풀이가 있다면 댓글로 알려주세요 !!
피드백 환영입니다☺️
728x90
'Algorithm' 카테고리의 다른 글
[백준] 1292번 : 쉽게 푸는 문제 - C/C++ (0) | 2025.03.11 |
---|---|
[백준] 11660번 : 구간 합 구하기 5 - C/C++ (0) | 2025.03.11 |
[자료구조] 구간 합 (0) | 2025.03.07 |
[백준] 10867번 : 중복 빼고 정렬하기 - C/C++ (0) | 2025.03.06 |
[백준] 2493번 : 탑 - C/C++ (0) | 2025.03.06 |