호근이는 겁이 많아 어두운 것을 싫어한다. 호근이에게 어떤 사진을 보여주려는데 사진의 밝기가 평균 이상이 되지 않으면 일절 보려 하지 않는다. 호근이가 이 사진에서 일부분이라도 볼 수 있는 부분을 찾아주자.
위 그림은 호근이에게 보여줄 5×6 크기의 사진이며, 각 픽셀은 밝기를 나타낸다. 호근이가 사진의 일부분이라도 볼 수 있는지 알아보기 위해서는 두 점 (r1, c1)과 (r2, c2)를 꼭짓점으로 하는 직사각형의 밝기 평균을 구해야 한다. 예를 들어, 위 그림에서는 (2, 2)와 (4, 5)를 꼭짓점으로 하는 직사각형을 말한다.
호근이에게 보여줄 R×C 크기의 사진이 주어질 때, 사진의 일부분에 해당하는 밝기 평균을 구하여라.
입력
첫 번째 줄에는 사진의 크기를 의미하는 정수 R, C (1 ≤ R, C ≤ 1,000)와 사진 일부분의 밝기 평균을 알아볼 개수를 의미하는 정수 Q (1 ≤ Q ≤ 10,000)가 주어진다.
다음 R개의 줄에 걸쳐 R×C 크기의 사진 정보가 주어지며, 사진의 각 픽셀에는 밝기를 의미하는 정수 K (1 ≤ K ≤ 1,000)가 주어진다.
다음 Q개의 각 줄에는 사진의 일부분을 나타내기 위한 두 꼭짓점을 의미하는 정수 r1, c1, r2, c2 (1 ≤ r1 ≤ r2 ≤ R, 1 ≤ c1 ≤ c2 ≤ C)가 주어진다.
출력
Q개의 각 줄에 주어진 사진에서 두 점 (r1, c1)과 (r2, c2)를 꼭짓점으로 하는 직사각형의 밝기 평균을 출력한다. 평균은 정수 나눗셈으로 몫만 취한다.
풀이 과정
가로 세로가 최대 1000인 직사각형 밝기 평균을 최대 10000번 구하는 것은 브루트포스에서 시간 초과가 날 수 있다. 밝기 합을 한번에 구할 수 있도록 2차원 누적합 배열을 구하여 ((r1, c1) 부터 (r2, c2) 까지의 합) 을 (r2 - r1 + 1) x (c2 - c1 + 1) 로 나눈 몫을 출력한다.
import sys
input = sys.stdin.readline
r, c, q = map(int, input().rstrip().split())
arr = [list(map(int, input().rstrip().split())) for _ in range(r)]
sums = [[0 for _ in range(c+1)]]
for i in range(r):
now = [0]
for j in range(c): now.append(now[-1] + sums[i][j+1] - sums[i][j] + arr[i][j])
sums.append(now)
for _ in range(q):
r1, c1, r2, c2 = map(int, input().rstrip().split())
print((sums[r2][c2] - sums[r2][c1-1] - sums[r1-1][c2] + sums[r1-1][c1-1])//((r2-r1+1)*(c2-c1+1)))
'-- 예전 기록 > BOJ' 카테고리의 다른 글
[ BOJ ] 1946 : 신입 사원 ( SILVER 1 ) / Python (0) | 2024.02.15 |
---|---|
[ BOJ ] 24523 : 내 뒤에 나와 다른 수 ( SILVER 2 ) / Python (0) | 2024.02.15 |
[ BOJ ] 11051 : 이항 계수 2 ( SILVER 2 ) / Python (0) | 2024.02.15 |
[ BOJ ] 18429 : 근손실 ( SILVER 3 ) / Python (0) | 2024.02.15 |
[ BOJ ] 19940 : 피자 오븐 ( GOLD 5 ) / Python (0) | 2024.02.10 |