๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/๋ฐฑ์ค€(BOJ)

[ ํŒŒ์ด์ฌ(python) ] ๋ฐฑ์ค€ 2167 - 2์ฐจ์› ๋ฐฐ์—ด์˜ ํ•ฉ

by YWTechIT 2021. 5. 10.
728x90

๐Ÿ“Œ ๋ฐฑ์ค€ 2167 - 2์ฐจ์› ๋ฐฐ์—ด์˜ ํ•ฉ

๋ฌธ์ œ ์„ค๋ช…


๐Ÿ’ก ๋‚˜์˜ ํ’€์ด

์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ค„์—ฌ์ฃผ๋Š” ๊ตฌ๊ฐ„ ํ•ฉ(prefix_sum)์œผ๋กœ ๊ตฌํ•˜๋ฉด ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ธ๋ฐ, ์ง€๊ธˆ๊นŒ์ง€ 1์ฐจ์› ๋ฐฐ์—ด์˜ ๊ตฌ๊ฐ„ํ•ฉ๋งŒ ํ•ด๋ดค์–ด์„œ 2์ฐจ์› ๋ฐฐ์—ด ์ผ ๋•Œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชฐ๋ž์—ˆ๋‹ค.

 

1์ฐจ์› ๋ฐฐ์—ด์—์„œ ๋ˆ„์  ํ•ฉ์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ–ˆ์—ˆ๋Š”์ง€ ํ•œ๋ฒˆ ์‚ดํŽด๋ณด์ž. ๋ˆ„์  ํ•ฉ -> ๊ตฌ๊ฐ„ ํ•ฉ ์ˆœ์„œ๋กœ ์‚ดํŽด๋ณผ ๊ฒƒ์ด๋‹ค.

 

  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. ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ

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])
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€