파이썬

[백준 파이썬] 11660번 구간 합 구하기

운으로 2022. 7. 30. 18:04

https://www.acmicpc.net/problem/11660

 

11660번: 구간 합 구하기 5

첫째 줄에 표의 크기 N과 합을 구해야 하는 횟수 M이 주어진다. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000) 둘째 줄부터 N개의 줄에는 표에 채워져 있는 수가 1행부터 차례대로 주어진다. 다음 M개의 줄에는 네

www.acmicpc.net

 

<코드>

import sys
input = sys.stdin.readline
n, m = map(int, input().split())

dp = [[0 for _ in range(n+1)] for _ in range(n+1)]
arr = [list(map(int, input().split())) for _ in range(n)]

for i in range(n):
    for j in range(n):
        dp[i+1][j+1] = dp[i][j+1] + dp[i+1][j] - dp[i][j] + arr[i][j]

for i in range(m):
    x1, y1, x2, y2 = map(int, input().split())
    result = dp[x2][y2] - dp[x2][y1-1] - dp[x1-1][y2] + dp[x1-1][y1-1]
    print(result)

 

<풀이방법>

 

 

좌표가 1,1이 시작이라서 0으로 감싼 dp 행렬을 만들고 (0,0) 부터 자기 좌표까지의 합을 dp에 저장한다.

 

x1,y1,x2,y2가 2,2,3,3이라고 가정하면

직사각형 전체 합 - 초록색 합 - 노란색 합 + 2번 빠진 부분을 더하면 원하는 빨간색 구간의 합을 구할 수 있다.

 

 

dp로 안 풀었다가 시간초과뜨고 sys.stdin 안 쓰니까 시간초과 떴다 ㅜㅜ