#문제링크
https://www.acmicpc.net/problem/15724
15724번: 주지수
네모 왕국의 왕인 진경대왕은 왕국의 영토를 편하게 통치하기 위해서 1X1의 단위 구역을 여러 개 묶어서 하나의 거대 행정구역인 주지수(州地數, 마을의 땅을 셈)를 만들 예정이다. 진경대왕은
www.acmicpc.net
#나의풀이
import sys
if __name__=="__main__":
N, M = map(int, sys.stdin.readline().split())
board = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]
for i in range(1, N):
for j in range(M):
board[i][j] += board[i-1][j]
T = int(sys.stdin.readline())
for _ in range(T):
s_x, s_y, e_x, e_y = map(int, sys.stdin.readline().split())
answer = sum(board[e_x-1][s_y-1:e_y])
if s_x > 1:
answer -= sum(board[s_x-2][s_y-1:e_y])
print(answer)
#해설
간단해보이지만 누적합 문제로 어떻게 누적합을 할것인가를 잘 생각해야하는 문제로
지금까지 누적합을 풀었을때 가로를 기준으로 누적합을 풀어 처음에 풀었다가 시간초과가 떠버렸고 세로로 누적합을 하면 시간을 많이 줄일수 있었다.
for i in range(1, N):
for j in range(M):
board[i][j] += board[i-1][j]
세로 기준으로 누적합을 만들어야해서 0번째 row는 건너뛰고 1번째 row부터 끝까지 진행한다.
for _ in range(T):
s_x, s_y, e_x, e_y = map(int, sys.stdin.readline().split())
answer = sum(board[e_x-1][s_y-1:e_y])
if s_x > 1:
answer -= sum(board[s_x-2][s_y-1:e_y])
print(answer)
answer에 끝행에 시작 y부터 끝 y 까지 각 열에 누적합을 해준것을 더해준다.
이후 시작이 행의 값 1(입력값이 1부터이므로 0을 의미함)보다 크다면 시작전에 누적된 부분은 빼줘야 하므로 값을 다시 빼주었다.
'코딩테스트' 카테고리의 다른 글
[백준/파이썬] 1068 트리 (0) | 2023.01.10 |
---|---|
[백준/파이썬] 1991 트리 순회 (0) | 2023.01.10 |
[백준/파이썬] 2468 안전영역 (0) | 2023.01.06 |
[백준/파이썬] 19640 화장실의 규칙 (0) | 2023.01.06 |
[백준/파이썬] 11000 강의실 배정 (0) | 2023.01.05 |