๐ ๋ฐฑ์ค 2167 - 2์ฐจ์ ๋ฐฐ์ด์ ํฉ
๐ก ๋์ ํ์ด
์๊ฐ ๋ณต์ก๋๋ฅผ ์ค์ฌ์ฃผ๋ ๊ตฌ๊ฐ ํฉ(prefix_sum)
์ผ๋ก ๊ตฌํ๋ฉด ์ฝ๊ฒ ํ ์ ์๋ ๋ฌธ์ ์ธ๋ฐ, ์ง๊ธ๊น์ง 1์ฐจ์ ๋ฐฐ์ด์ ๊ตฌ๊ฐํฉ๋ง ํด๋ดค์ด์ 2์ฐจ์ ๋ฐฐ์ด ์ผ ๋ ์ด๋ป๊ฒ ์ฌ์ฉํด์ผ ํ๋์ง ๋ฐฉ๋ฒ์ ์ ๋ชฐ๋์๋ค.
1์ฐจ์ ๋ฐฐ์ด์์ ๋์ ํฉ์ ์ด๋ป๊ฒ ๊ตฌํ์๋์ง ํ๋ฒ ์ดํด๋ณด์. ๋์ ํฉ
-> ๊ตฌ๊ฐ ํฉ
์์๋ก ์ดํด๋ณผ ๊ฒ์ด๋ค.
- ๋์ ํฉ ๊ตฌํ๊ธฐ
๋์ ํฉ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ 2๊ฐ์ง๊ฐ ์๋ค.append
๋ฐฉ๋ฒ๊ณผmemoization
๋ฐฉ๋ฒ์ธ๋ฐ, ๊ธฐ์ต์ด ์ ์ ๋๋ค๋ฉด ๋ค์ ์ฝ๋๋ฅผ ์ดํด๋ณด์.arr = [10, 20, 30, 40, 50]
์ ๊ณ ์ ์ด๋ค.
arr = [10, 20, 30, 40, 50]
# append
value = 0
append_sum = [0]
for i in arr:
value += i
append_sum.append(value)
print(append_sum)
๐๐ฝ [0, 10, 30, 60, 100, 150]
# memoization
memo_sum = [0] * (len(arr)+1)
for i in range(1, len(arr)+1):
memo_sum[i] = arr[i-1] + memo_sum[i-1]
print(memo_sum)
๐๐ฝ [0, 10, 30, 60, 100, 150]
๋ ๋ฐฉ์์ ์ฐจ์ด์ ์ ๋์ ํฉ ๋ฐฐ์ด ์ ์ฒด๋ฅผ 0์ผ๋ก ์ ์ธํ๋์ง ์ ํ๋์ง ์ฐจ์ด๊ณ , ๋๋จธ์ง๋ ๊ธฐ์กด arr
์ ๊ฐ์ ๋ด๊ฐ ๊ตฌํ๋ ค๊ณ ํ๋ ๊ฐ ์ด์ ๊น์ง ๋์ ํฉ์ ๋ํ๋ ๋ฐฉ์์ธ๋ฐ ๋ค์ ์ฌ์ง์ ๋ณด๋ฉด ์ดํด๊ฐ ๋ ๊ฒ์ด๋ค.
์ด์ 2์ฐจ์ ๋ฐฐ์ด์์์ ๋์ ํฉ์ ๊ตฌํด๋ณด์. 1์ฐจ์ ๋ฐฐ์ด์์๋ ๋ฐฉ๊ธ ๊ฐ์ ๊ณผ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ํ์ ์ธ ๋ฐฉํฅ์ผ๋ก ์ ์ฅํ ์ ์์ง๋ง, 2์ฐจ์ ๋ฐฐ์ด์ ํ๊ณผ ์ด ๋ชจ๋ ์๊ฐํด์ผ ํ๋ค. ๊ทธ๋์ memoization
๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
๋ฌธ์ ์์ ์ ์๋ 2์ฐจ์ ๋ฐฐ์ด 3*4
ํํ์ธ [[1, 2, 4], [8, 16, 32]]
๋ฅผ ๊ธฐ์ค์ผ๋ก ์๊ฐํด๋ณด์. 1์ฐจ์ ๋ฐฐ์ด [0] ๋ฒ์งธ์ ๋๋ฏธ ๋ฐ์ดํฐ(dummy_data) 0์ ์ค ๊ฒ์ฒ๋ผ 2์ฐจ์ ๋ฐฐ์ด์์๋ ์ฒซ ๋ฒ์งธ ํ๊ณผ ์ฒซ ๋ฒ์งธ ์ด์ ๋๋ฏธ ๋ฐ์ดํฐ์ธ 0์ ์ฃผ์.
์๋ฅผ ๋ค์ด memo[1][1]์ ๊ตฌํ๋ ค๋ฉด arr[0][0] - memo[0][1] - memo[1][0] + memo[0][0]
์ ํด์ฃผ๋ฉด ๋๊ณ , memo[2][2]๋ฅผ ๊ตฌํ๋ ค๋ฉด arr[1][1] - memo[1][2] - memo[2][1] + memo[1][1]
์ ํด์ฃผ๋ฉด ๋๋ค.
๋ง์ง๋ง์ memo[1][1]
์ ๋ํด์ฃผ๋ ์ด์ ๋ ์์์ 2๋ฒ์ ์ค๋ณตํด์ ๋บ๊ธฐ ๋๋ฌธ์ ๋ํด์ค ๊ฒ์ด๋ค.
- ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ
1์ฐจ์๋ฐฐ์ด์์ ๊ตฌ๊ฐ ํฉ์ ํ์ฌ ๊ตฌํ๋ ค๊ณ ํ๋ ๊ฐ - ์ด์ ๊น์ง์ ๊ฐ ์ค ๊ตฌํ๋ ค๋ ๊ฐ์ ์ ์ธํ ๋ถ๋ถ์ผ๋ก ๋ํ๋ผ ์ ์๋ค. ๊ทธ๋ผ 2์ฐจ์ ๋ฐฐ์ด์์๋ ์ด๋ป๊ฒ ๊ตฌํ ๊น? 1๋ฒ์์ ๋์ ํฉ์ ๊ตฌํ ๊ฒ์ฒ๋ผ ํ๊ณผ ์ด ๋ชจ๋ ์๊ฐํด์ค์ผ ํ๋๋ฐ ๋ค์ ์ฌ์ง์ฒ๋ผ ๋ํ ๋ผ ์ ์๋ค. ์ค์ํ ๊ฒ์ ์ค๋ณต๋๋ ๋ถ๋ถ์ ๋ํด์ฃผ๋ ๊ฒ์ด๋ค.
1๋ฒ๊ณผ 2๋ฒ๊ณผ์ ์ ํตํ์ด ํท๊ฐ๋ฆฌ์ง ๋ง์์ผ ํ๋์ ์ ๋์ ํฉ์ ์ค๋ณต๋ ๋ถ๋ถ์ ๋นผ์ฃผ๊ณ ๊ตฌ๊ฐ ํฉ์ ์ค๋ณต๋ ๋ถ๋ถ์ ๋ํ๋ ๊ฒ์ด๋ค.
์ค๋ช ์ด ๊ธธ์์ง๋ง ์ฝ๋๋ ๋จ์ํ๋ค.
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(n)]
memo = [[0] * (m+1) for _ in range(n+1)]
for i in range(1, n+1):
for j in range(1, m+1):
memo[i][j] = arr[i-1][j-1] + memo[i][j-1] + memo[i-1][j] - memo[i-1][j-1]
k = int(input())
for _ in range(k):
i, j, x, y = map(int, input().split())
print(memo[x][y] - memo[i-1][y] - memo[x][j-1] + memo[i-1][j-1])
'Algorithm > ๋ฐฑ์ค(BOJ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ ํ์ด์ฌ(python) ] ๋ฐฑ์ค 5598 - ์นด์ด์ฌ๋ฅด ์ํธ (0) | 2021.05.11 |
---|---|
[ ํ์ด์ฌ(python) ] ๋ฐฑ์ค 2948 - 2009๋ (0) | 2021.05.11 |
[ ํ์ด์ฌ(python) ] ๋ฐฑ์ค 1406 - ์๋ํฐ (0) | 2021.05.10 |
[ ํ์ด์ฌ(python) ] ๋ฐฑ์ค 2693 - N๋ฒ์งธ ํฐ ์ (0) | 2021.05.07 |
[ ํ์ด์ฌ(python) ] ๋ฐฑ์ค 10866 - ๋ฑ (0) | 2021.05.05 |
๋๊ธ