๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[์ด๊ฒ์ด ์ฝ๋ฉ ํ ์คํธ๋ค with Python]_40_๊ตฌ๊ฐ ํฉ ๋น ๋ฅด๊ฒ ๊ณ์ฐํ๊ธฐ ๋ณธ๋ฌธ
[์ด๊ฒ์ด ์ฝ๋ฉ ํ ์คํธ๋ค with Python]_40_๊ตฌ๊ฐ ํฉ ๋น ๋ฅด๊ฒ ๊ณ์ฐํ๊ธฐ
์ง์ง์ํ์นด 2022. 2. 16. 00:30220216 ์์ฑ
<๋ณธ ๋ธ๋ก๊ทธ๋ ใ์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉ ํ ์คํธ๋คใ ์ youtube๋ฅผ ์ฐธ๊ณ ํด์ ๊ณต๋ถํ๋ฉฐ ์์ฑํ์์ต๋๋ค>
https://www.youtube.com/watch?v=kqyHnoriStk&list=PLVsNizTWUw7H9_of5YCB0FmsSc-K44y81&index=40
1. ๊ตฌ๊ฐ ํฉ (interval sum)
: ์ฐ์์ ์ผ๋ก ๋์ด๋ N๊ฐ์ ์๊ฐ ์์ ๋, ํน์ ๊ตฌ๊ฐ์ ๋ชจ๋ ์๋ฅผ ํฉํ ๊ฐ์ ๊ณ์ฐํ๋ ๋ฌธ์
1) N๊ฐ์ ์ ์๋ก ๊ตฌ์ด๋ ์์ด
2) M๊ฐ์ ์ฟผ๋ฆฌ ์ ๋ณด ์ฃผ์ด์ง
- ๊ฐ ์ฟผ๋ฆฌ๋ LEFT, RIGHT ์ผ๋ก ๊ตฌ์ฑ
- ๊ฐ ์ฟผ๋ฆฌ์ ๋ํ์ฌ [LEFT, RIGHT] ๊ตฌ๊ฐ์ ํฌํจ๋ ๋ฐ์ดํฐ๋ค์ ํฉ ์ถ๋ ฅ
3) O(N+M)
2. ์ ๋์ฌ ํฉ (Prefix sum)
: ๋ฐฐ์ด์ ๋งจ ์๋ถํฐ ํน์ ์์น๊น์ง์ ํฉ ๋ฏธ๋ฆฌ ๊ตฌํ๊ธฐ
- N๊ฐ์ ์ ์์น ๊ฐ๊ฐ์ ๋ํ์ฌ ์ ๋์ฌ ํฉ์ ๊ณ์ฐํ์ฌ P์ ์ ์ฅ
- ๋งค M๊ฐ์ ์ฟผ๋ฆฌ ์ ๋ณด๋ฅผ ํ์ธํ ๋ ๊ตฌ๊ฐ ํฉ์ P[RIGHT] - P[LEFT - 1]
- python
# ๋ฐ์ดํฐ์ ๊ฐ์ N๊ณผ ์ ์ฒด ๋ฐ์ดํฐ ์ ์ธ
n = 5
data = [10, 20, 30, 40, 50]
# ์ ๋์ฌ ํฉ(Prefix Sum) ๋ฐฐ์ด ๊ณ์ฐ
sum_value = 0
prefix_sum = [0]
for i in data:
sum_value += i
prefix_sum.append(sum_value)
# ๊ตฌ๊ฐ ํฉ ๊ณ์ฐ (์ธ ๋ฒ์งธ ์๋ถํฐ ๋ค ๋ฒ์งธ ์๊น์ง)
left = 3
right = 4
print(prefix_sum[right] - prefix_sum[left - 1])
- c++
#include <bits/stdc++.h>
using namespace std;
int n = 5; // ๋ฐ์ดํฐ์ ๊ฐ์ N๊ณผ ๋ฐ์ดํฐ ์
๋ ฅ๋ฐ๊ธฐ
int arr[] = {10, 20, 30, 40, 50};
int prefixSum[6];
int main() {
// ์ ๋์ฌ ํฉ(Prefix Sum) ๋ฐฐ์ด ๊ณ์ฐ
int sumValue = 0;
for (int i = 0; i < n; i++) {
sumValue += arr[i];
prefixSum[i + 1] = sumValue;
}
// ๊ตฌ๊ฐ ํฉ ๊ณ์ฐ(์ธ ๋ฒ์งธ ์๋ถํฐ ๋ค ๋ฒ์งธ ์๊น์ง)
int left = 3;
int right = 4;
cout << prefixSum[right] - prefixSum[left - 1] << '\n';
}
- java
import java.util.*;
class Main {
public static int n = 5; // ๋ฐ์ดํฐ์ ๊ฐ์ N๊ณผ ๋ฐ์ดํฐ ์
๋ ฅ๋ฐ๊ธฐ
public static int arr[] = {10, 20, 30, 40, 50};
public static int[] prefixSum = new int[6];
public static void main(String[] args) {
// ์ ๋์ฌ ํฉ(Prefix Sum) ๋ฐฐ์ด ๊ณ์ฐ
int sumValue = 0;
for (int i = 0; i < n; i++) {
sumValue += arr[i];
prefixSum[i + 1] = sumValue;
}
// ๊ตฌ๊ฐ ํฉ ๊ณ์ฐ(์ธ ๋ฒ์งธ ์๋ถํฐ ๋ค ๋ฒ์งธ ์๊น์ง)
int left = 3;
int right = 4;
System.out.println(prefixSum[right] - prefixSum[left - 1]);
}
}