※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 2015번 문제인 수들의 합 4이다.
문제는 아래 링크를 확인하자.

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

 

2015번: 수들의 합 4

첫째 줄에 정수 N과 K가 주어진다. (1 ≤ N ≤ 200,000, |K| ≤ 2,000,000,000) N과 K 사이에는 빈칸이 하나 있다. 둘째 줄에는 배열 A를 이루는 N개의 정수가 빈 칸을 사이에 두고 A[1], A[2], ..., A[N]의 순서로

www.acmicpc.net

구간 [L,R](L>1)의 수의 합은 [1,R] 구간의 수의 합에서 [1,L-1]의 수의 합을 빼는 것으로 계산해낼 수 있다.

 

이를 이용해 첫 항부터 i번째 항까지의 누적합의 값들을 관리하는 것으로 문제를 빠르게 해결할 수 있다.

 

구체적으로, [1,R] 구간의 수의 합 S를 알고 있을 때, [1,r](r<R)의 구간의 합이 S-K인 r의 개수를 구해낼 수 있다면 R로 끝나면서 합이 K인 구간의 개수를 구해낼 수 있다. 이를 R을 1씩 증가시키면서 반복하는 것으로 문제를 해결할 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <map>
using namespace std;
typedef long long ll;

int N, K;
int psum;
map<int, int> mp;
ll ans;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	mp.insert(make_pair(0, 1));

	cin >> N >> K;
	for (int i = 0; i < N; i++) {
		int x; cin >> x;
		psum += x;
		
		if (mp.count(psum - K)) ans += mp[psum - K];
		if (mp.count(psum)) mp[psum]++;
		else mp.insert(make_pair(psum, 1));
	}

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 1821 // C++] 수들의 합 6  (0) 2023.04.05
[BOJ 2018 // C++] 수들의 합 5  (0) 2023.04.04
[BOJ 2007 // C++] 수들의 합 3  (0) 2023.04.02
[BOJ 2003 // C++] 수들의 합 2  (0) 2023.04.01
[BOJ 13915 // C++] 현수의 열기구 교실  (0) 2023.03.31

+ Recent posts