๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜

[๊ธฐ๋ณธ] ํ•ฉ๋ฐฐ์—ด๊ณผ ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ

by ์„œ์•„๋ž‘๐Ÿ˜ 2025. 3. 8.

 

 

ํ•ฉ๋ฐฐ์—ด๊ณผ ๊ตฌ๊ฐ„ํ•ฉ

ํ•ฉ๋ฐฐ์—ด์€ ํŠน์ • ๋ฐฐ์—ด์˜ ๋ˆ„์  ํ•ฉ์„ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด๋กœ, ๊ตฌ๊ฐ„ํ•ฉ์„ ๋น ๋ฅด๊ฒŒ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด์˜ i๋ฒˆ์งธ๊นŒ์ง€์˜ ๋ˆ„์  ํ•ฉ์„ ์ €์žฅํ•˜์—ฌ, ํŠน์ • ๊ตฌ๊ฐ„์˜ ํ•ฉ์„ O(1) ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ฉ๋ฐฐ์—ด ๊ณ„์‚ฐ

๋ฐฐ์—ด A๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ํ•ฉ๋ฐฐ์—ด S๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋ฉ๋‹ˆ๋‹ค.

S[i]=A[1]+A[2]+...+A[i]

์ฆ‰,

  • S[0]=0 (๊ธฐ๋ณธ๊ฐ’)
  • S[i]=S[i−1]+A[i]

๋ฅผ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ

๋ฐฐ์—ด A=[2,4,5,7,9,12] ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ํ•ฉ๋ฐฐ์—ด S ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

i A[i] S[i]
0 0 0
1 2 2
2 4 6
3 5 11
4 7 18
5 9 27
6 12 39

 

๊ตฌ๊ฐ„ํ•ฉ ๊ณ„์‚ฐ

๊ตฌ๊ฐ„ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๊ณต์‹์€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ตฌ๊ฐ„ i์—์„œ j๊นŒ์ง€์˜ ๊ตฌ๊ฐ„ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๊ณต์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • S[j] - S[i -1]

  • ์˜ˆ:
    ๊ตฌ๊ฐ„ [2, 5]์˜ ํ•ฉ์€ S[5] - S[1] = 25
    ๊ตฌ๊ฐ„ [3, 4]์˜ ํ•ฉ์€ S[4] - S[2] = 12
    ๊ตฌ๊ฐ„ [5, 5]์˜ ํ•ฉ์€ S[5] - S[4] = 9

 

์‹œ๊ฐ„๋ณต์žก๋„ ๋น„๊ต

  • ๊ธฐ๋ณธ ๋ฐฉ์‹: ๊ตฌ๊ฐ„ํ•ฉ์„ ์ง์ ‘ ๋”ํ•˜๋ฉด O(N)
  • ํ•ฉ๋ฐฐ์—ด ์ด์šฉ: ํ•œ ๋ฒˆ์˜ ๋บ„์…ˆ์œผ๋กœ O(1)

์ฆ‰, ํ•ฉ๋ฐฐ์—ด์„ ์‚ฌ์ „์— O(N) ์— ๊ณ„์‚ฐํ•ด๋‘๋ฉด, ๊ตฌ๊ฐ„ํ•ฉ์„ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์‹ค์ „ ๋ฌธ์ œ

๋ฐฑ์ค€ 11659: ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ 4(๋งํฌ)

 

๋ฌธ์ œ

์ˆ˜ N๊ฐœ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, i๋ฒˆ์งธ ์ˆ˜๋ถ€ํ„ฐ j๋ฒˆ์งธ ์ˆ˜๊นŒ์ง€ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ˆ˜์˜ ๊ฐœ์ˆ˜ N๊ณผ ํ•ฉ์„ ๊ตฌํ•ด์•ผ ํ•˜๋Š” ํšŸ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” N๊ฐœ์˜ ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ˆ˜๋Š” 1,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ์…‹์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์—๋Š” ํ•ฉ์„ ๊ตฌํ•ด์•ผ ํ•˜๋Š” ๊ตฌ๊ฐ„ i์™€ j๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ด M๊ฐœ์˜ ์ค„์— ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ i๋ฒˆ์งธ ์ˆ˜๋ถ€ํ„ฐ j๋ฒˆ์งธ ์ˆ˜๊นŒ์ง€ ํ•ฉ์„ ์ถœ๋ ฅํ•œ๋‹ค.

์ œํ•œ

  • 1 ≤ N ≤ 100,000
  • 1 ≤ M ≤ 100,000
  • 1 ≤ i ≤ j ≤ N

์˜ˆ์ œ ์ž…๋ ฅ 1

5 3
5 4 3 2 1
1 3
2 4
5 5

์˜ˆ์ œ ์ถœ๋ ฅ 1

12
9
1

 

์‹œ๊ฐ„์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ •๋‹ต ๋น„์œจ
1 ์ดˆ 256 MB 38.466%

 

์ฝ”๋“œ

// C++ 17
#include <iostream>
#include <vector>

using namespace std;

int main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
    
	int dataCount, queryCount = 0;
	cin >> dataCount >> queryCount;

	vector<int> rangeSum;
	rangeSum.reserve(dataCount + 1);
	rangeSum.push_back(0);
	
	for (int i = 0; i < dataCount; i++)
	{
		int data;
		cin >> data;
		rangeSum.push_back(rangeSum[i] + data);
	}

	for (int i = 0; i < queryCount; i++)
	{
		int start, end;
		cin >> start >> end;
		cout << rangeSum[end] - rangeSum[start - 1] << '\n';
	}
}

 

๋ฐฐ์—ด ์ž…๋ ฅ์„ ๋ฐ›์ž๋งˆ์ž ํ•ฉ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ , ๊ตฌ๊ฐ„์ด ์ฃผ์–ด์ง€๋Š” ์ฆ‰์‹œ ๊ตฌ๊ฐ„ํ•ฉ ๊ณต์‹์„ ํ†ตํ•ด ์ถœ๋ ฅํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

 

๋Œ“๊ธ€