1D Prefix Sum
โ๐ป ๊ตฌ๊ฐ ํฉ ๋ฌธ์ ๋ ์ฐ์์ ์ผ๋ก ๋์ด๋ N๊ฐ์ ์๊ฐ ์์ ๋, ํน์ ๊ตฌ๊ฐ์ ๋ชจ๋ ์๋ฅผ ํฉํ ๊ฐ์ ๊ณ์ฐํ๋ ๋ฌธ์ ์ ํ์ ๋ปํ๋ค.
โ๐ป ์๋ฅผ ๋ค๋ฉด, 5๊ฐ์ ๋ฐ์ดํฐ๋ก ๊ตฌ์ฑ๋ ์์ด {10, 20, 30, 40, 50}์ด ์๋ค๊ณ ๊ฐ์ ํ์ ๋, 2๋ฒ์งธ ์๋ถํฐ 4๋ฒ์งธ ์๊น์ง์ ํฉ์ 20 + 30 + 40์ธ 90์ด ๋๋ค.
โ๐ป N๊ฐ์ ์ ์๋ก ๊ตฌ์ฑ๋ ์์ด์ด ์๊ณ , M๊ฐ์ query ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ query๋ left์ right๋ก ๊ตฌ์ฑ. ๊ฐ query์ ๋ํ์ฌ [left, right] ๊ตฌ๊ฐ์ ํฌํจ๋ ๋ฐ์ดํฐ๋ค์ ํฉ์ ์ถ๋ ฅํด์ผ ํ๋ค. (์ํ ์๊ฐ ์ ํ์ O(N+M))
→ ์ ์์ ์ ๋ชฉํ์๋ฉด, 5๊ฐ์ ๋ฐ์ดํฐ (N=5)๋ก ๊ตฌ์ฑ๋ ์์ด์์ ๋งค๋ฒ ์๋ก์ด query ๊ตฌ๊ฐ๋ง๋ค ํด๋น ํฉ์ ๊ตฌํ๋ค๋ฉด ์๊ฐ ๋ณต์ก๋๋ O(N*M)
→ ์ด ๋, ์๊ฐ์ ํจ์จ์ฑ์ ์ํด ๊ตฌ๊ฐ ํฉ(Prefix Sum; Interval Sum) ์์ด๋์ด๋ฅผ ์ฌ์ฉ!
โป ๊ตฌ๊ฐ ํฉ = ๋ฐฐ์ด์ ๋งจ ์๋ถํฐ ํน์ ์์น๊น์ง์ ํฉ์ ๋ฏธ๋ฆฌ ๊ตฌํด ๋์ ๊ฒ โป
→ ๋ฐ๋ผ์ N๊ฐ์ ์ ์์น ๊ฐ๊ฐ์ ๋ํ์ฌ ์ ๋์ฌ ํฉ์ ๊ณ์ฐํ์ฌ P์ ์ ์ฅํ ๋ค, ๋งค M๊ฐ์ ์ฟผ๋ฆฌ ์ ๋ณด๋ฅผ ํ์ธํ ๋ ๊ตฌ๊ฐ ํฉ์ P[Right] - P[Left-1]
โ๐ป ์์ 0์ ๋ถ์ด๋ฉด i๋ฒ์งธ๋ถํฐ j๋ฒ์งธ์ ๋ถ๋ถํฉ์ ๊ตฌํ ๋, i = 1์ผ ๋์ ์ฒ๋ฆฌ๋ฅผ ๋ณ๋๋ก ํ์ง ์์๋ ๋๋ค. ์ ๊ทธ๋ฆผ์์ pre_sum = [0, 10, 30, 60, 100, 150]์ผ๋ก ๋ง๋ค์๋ค๋ฉด 1๋ฒ์งธ๋ถํฐ 3๋ฒ์งธ์ ๋ถ๋ถํฉ์ ์ ๊ตฌ๊ฐํฉ ๊ณต์์ ์ํด pre_sum[3] - pre_sum[0]์ผ๋ก ์ฝ๊ฒ ๊ตฌํ ์ ์๋ค. ๋ง์ฝ ์์ 0์ ๋ถ์ด์ง ์์๋ค๋ฉด i๊ฐ 1์ผ ๋ ๋ณ๋๋ก ์์ ์ถ๊ฐ๋ก ๋ง๋ค์ด์ฃผ์ด์ผ ํ๋ค.
2D Prefix Sum
โ๐ป1์ฐจ์๊ณผ ๋ค๋ฅด๊ฒ 2์ฐจ์ ๋ฐฐ์ด์์์ ๋ถ๋ถํฉ์ ํฌํจ-๋ฐฐ์ ์ ์๋ฆฌ๋ฅผ ์ฌ์ฉํด ๋์ ํฉ์ ๊ตฌํ๋ค. ์๋ ๊ทธ๋ฆผ์ ์ฐธ๊ณ ํ์.
: ์ ๋ ธ๋์ ๋ถ๋ถ ์ฌ๊ฐํ(3x3) ๋ด์ 9๊ฐ์ ์ซ์์ ํฉ(๋ถ๋ถํฉ)์ ๊ตฌํ๊ณ ์ ํ๋ค. ์ผ๋จ ์ ์ฒด ํ๋์ ์ฌ๊ฐํ (1)์ ๋ค์ด๊ฐ ๋ชจ๋ ์ซ์์ ํฉ์์ (2) ๋นจ๊ฐ์ ์ฌ๊ฐํ ๋ด์ ๋ชจ๋ ์ซ์์ ํฉ์ ๋นผ๊ณ , ์ด๋ก์ ์ฌ๊ฐํ (3)์ ๋ค์ด๊ฐ ๋ชจ๋ ์ซ์์ ํฉ๋ ๋บ๋ค. ๊ทธ ๋ค์, (2)์ (3)์ ๊ณตํต์ผ๋ก ๋บ์ผ๋ฏ๋ก, ๋ ๋ฒ ๋บ ์ฃผํฉ์ ์ฌ๊ฐํ (4)๋ฅผ ํ ๋ฒ ๋ํ๋ค. (ํฌํจ - ๋ฐฐ์ ์ ์๋ฆฌ)
โ๐ปโ ์ฃผ์ด์ง 2์ฐจ์ ๋ฐฐ์ด์์ ๋์ ํฉ ๊ตฌํ๊ธฐ
: ์ด๋ฏธ ์ฃผ์ด์ง 2์ฐจ์ ๋ฐฐ์ด์์ 2์ฐจ์ ๋์ ํฉ ๋ฐฐ์ด์ ๊ตฌํ ์๋ ์๊ณ , ๊ฐ row๋ฅผ ์ ๋ ฅ ๋ฐ๋ ๊ณผ์ ์์ ๊ตณ์ด ์ซ์๋ก๋ง ์ฃผ์ด์ง 2์ฐจ์ ๋ฐฐ์ด์ ๋ง๋ค ํ์ ์์ด ๋์ค๋์ค 2์ฐจ์ ๋์ ํฉ ๋ฐฐ์ด์ ๋ง๋ค ์๋ ์๋ค.
โ ์ด ๋, 1์ฐจ์ ๋์ ํฉ ๋ฐฐ์ด๊ณผ ๋์ผํ๊ฒ 2์ฐจ์ ๋์ ํฉ ๋ฐฐ์ด ์์ชฝ / ์ผ์ชฝ์ 0์ ์ผ๋ ฌ๋ก ๋ง๋๋๊ฒ ํธํ๋ค. ์ดํ ๊ณต์ ํ ๋ฒ๋ง ์จ์ ํ๋ฒ์ 2์ฐจ์ ๋ถ๋ถํฉ์ ๊ตฌํ ์ ์๋ค!
2D Cumsum(Prefix Sum) Array & 2D Sum of Sub-Matrix
ex) NxM size์ 2D array๋ฅผ ๋ง๋ ๋ค ๊ฐ์ . ๊ทธ๋ฌ๋ฉด 2์ฐจ์ ๋์ ํฉ ๋ฐฐ์ด(psum) size๋ (N+1)x(M+1)์ด ๋๊ณ , ์๋ ์์๋ก๋ N=5, M=4
โ N๊ณผ M์ ์ ๋ ฅ ๋ฐ๊ณ , psum์ ์ฒซ๋ฒ์งธ ํ์ (M+1)๊ฐ์ 0์ผ๋ก ๊ตฌ์ฑ๋ list๋ก ์ผ๋จ ์์ฑ
N,M=map(int,input().split())
psum=[[0]*(M+1)]
โก 1๋ถํฐ Nํ๊น์ง for๋ฌธ์ผ๋ก ๋๋ฆฐ๋ค. ๋จผ์ psum์ appendํ list๋ฅผ [0]์ผ๋ก ์ด๊ธฐํํ๋ค.
for i in range(1,N+1):
psum.append([0])
โข ์ ๋ ฅ ๋ฐ์ ํ ํ(row)์ ์ ๋ถ๋ถ์ 0์ ๋ถ์ธ list l ์์ฑ
for i in range(1,N+1):
psum.append([0])
l=[0]+list(map(int,input().split()))
โฃ list l์ ๋๋ฒ์งธ ์์(0 ๊ทธ ๋ค์)๋ถํฐ for๋ฌธ์ ๋๋ ค (0,0)๋ถํฐ(2D array์ ์ผ์ชฝ ๋ ์์๋ถ๋ถ) ํ์ฌ ์์๋ฅผ ํฌํจํ 2์ฐจ์ ๋ฐฐ์ด๊น์ง์ ๋์ ํฉ์ psum[-1]์ ์ ๋ฐ์ดํธํ๋ค.
: ์ ๊ทธ๋ฆผ์ ์๋ก ๋ค์๋ฉด ๊ทธ๋ฆผ ์ผ์ชฝ ์ง์ฌ๊ฐํ์์ 2x2 ํํ์ ํ๋์ ์ฌ๊ฐํ ๋ถ๋ถํฉ์ ๊ตฌํ๊ณ ์ ํ๋ค. 6์ ๋ฃ์ผ๋ ค๊ณ ํ ๋ (๋ณธ์ธ 6) + (์ผ์ชฝ ๋นจ๊ฐ์ ์ง์ฌ๊ฐํ์ ๋์ ํฉ์ธ 5) + (์ ์ฐ๋์ ์ง์ฌ๊ฐํ์ ๋์ ํฉ์ธ 8) - (๋ ์ง์ฌ๊ฐํ์ ๊ณตํต ๋ถ๋ถ ๋ณด๋ผ์ ๋์ ํฉ 3)์ผ๋ก 6 + 5 + 8 - 3์ด ๋์ด 16์ด ๋๋ค. ์ด๋ ์๋์ ๊ฐ์ด ํ์ด์ฌ ์ฝ๋๋ก ๊ตฌํ ๊ฐ๋ฅ
for i in range(1,N+1):
psum.append([0])
l=[0]+list(map(int,input().split()))
for x in range(1,len(l)):
psum[-1].append(l[x]+psum[i][x-1]+psum[i-1][x]-psum[i-1][x-1])
โค ์ด์ 2D cumulative sum array(๋์ ํฉ 2์ฐจ์ ๋ฐฐ์ด)๋ฅผ ๋ง๋ค์์ผ๋ฏ๋ก ์์ ๋กญ๊ฒ 2D Sum of Sub-Matrix(๋ถ๋ถํฉ 2์ฐจ์ ๋ฐฐ์ด)์ ๊ตฌํด๋ณด์.
ex) ์์ฑ๋ 2D cumulative sum array๋ฅผ ํ์ฉ, (2,2)๋ถํฐ (3,4)๊น์ง์ ๋ถ๋ถํฉ ๊ตฌํ๊ธฐ(x์ y ๋ชจ๋ ๋ถ์ธ 0 ์ ์ธํ ๋ด์ฉ์ ์ผ์ชฝ ์๋ถํฐ 1๋ถํฐ ์์ํ๋ค ๊ฐ์ )
: ์ ํ๋์ ์ฌ๊ฐํ์ ๋ถ๋ถํฉ์ ๊ตฌํ๋ ๊ฒ์ด๋ฏ๋ก (3,4)๊น์ง์ ๋ถ๋ถํฉ์ธ ์ฐ๋์ ์ฌ๊ฐํ ๋์ ํฉ(55) - (3,1)๊น์ง์ ๋ถ๋ถํฉ์ธ ๋ ธ๋์ ์ฌ๊ฐํ ๋์ ํฉ(13) - (1,4)๊น์ง์ ๋ถ๋ถํฉ์ธ ์ฃผํฉ์ ์ฌ๊ฐํ ๋์ ํฉ(17) + ๊ณตํต ๋ถ๋ถ ๋์ ํฉ (3) ๊ฒฐ๊ณผ (55 - 13 - 17 + 3) 28์ด ๋์จ๋ค. 28์ ๊ณง 6 + 4 + 10 + 4 + 3 + 1 ๊ฒฐ๊ณผ์ ๊ฐ์์ ์ ์ ์๋ค.
: ์ฆ code๋ก ๋ํ๋ด๊ธฐ ์ํด index๋ฅผ ์ ํด๋ณธ๋ค๋ฉด (x1,y1)๋ฒ์งธ๋ถํฐ (x2,y2)๋ฒ์งธ ๊น์ง์ ๋ถ๋ถํฉ์ ๊ตฌํ๊ธฐ ์ํด์๋ ๊ณต์ psum[x2][y2] - psum[x2][y1-1] - psum[x1-1][y2] + psum[x1-1][y1-1]๋ก ๊ตฌํ ์ ์๋ค.
for _ in range(int(input())):
x1,y1,x2,y2=map(int,input().split())
print(psum[x2][y2]-psum[x2][y1-1]-psum[x1-1][y2]+psum[x1-1][y1-1])
code
(1) 1D Prefix Sum
#1D Prefix Sum
n=5
data=[10,20,30,40,50]
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]) #70
(2) 2D Prefix Sum
: NxM ํํ์ 2D array๋ฅผ row๋ณ๋ก ์ ๋ ฅ ๋ฐ๊ณ , ์ ๋ ฅ ๋ฐ์ผ๋ฉด์ ๋ฐ๋ก prefix sum 2D Array๋ฅผ ๋ง๋ ๋ค, (x1,y1) ~ (x2,y2)๋ฒ์งธ ์ฌ์ด์ ๋ชจ๋ ์์ 2D ๋ถ๋ถ ๋์ ํฉ ์ถ๋ ฅ (BOJ 2167 ๋ด์ฉ)
N,M=map(int,input().split())
psum=[[0]*(M+1)]
for i in range(1,N+1):
psum.append([0])
l=[0]+list(map(int,input().split()))
for x in range(1,len(l)):
psum[-1].append(l[x]+psum[i][x-1]+psum[i-1][x]-psum[i-1][x-1])
for _ in range(int(input())):
x1,y1,x2,y2=map(int,input().split())
print(psum[x2][y2]-psum[x2][y1-1]-psum[x1-1][y2]+psum[x1-1][y1-1])
Exercises
โ <BOJ S5 2167 2์ฐจ์ ๋ฐฐ์ด์ ํฉ> โ
: 2์ฐจ์ ๋ฐฐ์ด ๋์ ํฉ ๋ํ ๋ฌธ์
โ <BOJ S1 11660 ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ 5> โ
: 2167๊ณผ ๋์ผ. ๋ค๋ง NxN 2์ฐจ์ ๋ฐฐ์ด์์ ๋์ ํฉ ๊ตฌํ๊ธฐ. size์ ์ ํ์ด ์ปค ์ 2167๊ณผ ๋ค๋ฅด๊ฒ ๋์ ํฉ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก๋ง ํ์ด ๊ฐ๋ฅ
โ <BOJ S3 11659 ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ 4> โ
: 1์ฐจ์ ๋ฐฐ์ด ๋์ ํฉ ๋ํ ๋ฌธ์
โ <BOJ S4 13900 ์์์์ ๊ณฑ์ ํฉ> โ
: ์๋ก ๋ค๋ฅธ ๋ ์์น์ ๋ ์๋ฅผ ์ ํ ๋ ์ผ์ชฝ๋ถํฐ ๋์ ํฉ ๊ฐ๋ ์ผ๋ก mulsum ๊ณฑ์ ํฉ ์์ด๋์ด์์ ์์์ฐจ๋ฆฌ๋ ๊ฒ์ด ์ค์
1D prefix sum array ๊ทธ๋ฆผ ์ด์ฝํ 2021 ์ฐธ๊ณ
'Computer Science > Algorithms' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ข Topology Sort (3) | 2024.10.11 |
---|---|
๐ฃ Fibonacci Sequence (0) | 2024.06.26 |
๐ฒ Divide&Conquer (1) | 2024.06.08 |
๐ Power by Divide and Conquer (1) | 2024.06.06 |
๐ฃ๏ธ Shortest Path in an Unweighted Graph (0) | 2024.05.23 |
๋๊ธ