[백준] 11660번 구간 합 구하기 5

HL·2021년 1월 30일
0

백준

목록 보기
54/104

문제 링크

문제 설명

  • board 가 주어진다
  • 특정 좌표 y1, x2 부터 y2, x2 까지의 합을 출력

풀이

  • 처음에 그때 그때 합을 구해봤지만 당연하게도 시간초과
  • DP로 (0, 0)부터 특정 좌표까지의 합을 모두 저장
  • 범위가 주어졌을 때 다음처럼 값을 계산해 출력

코드

import sys


def init():
    n, m = map(int, ipt().split())
    board = [tuple(map(int, ipt().split())) for _ in range(n)]
    quest_list = [tuple(map(int, ipt().split())) for _ in range(m)]
    dp = [[0] * n for _ in range(n)]
    dp[0][0] = board[0][0]
    for j in range(1, n):
        dp[0][j] = dp[0][j-1] + board[0][j]
    for i in range(1, n):
        dp[i][0] = dp[i-1][0] + board[i][0]
    return n, quest_list, board, dp


ipt = sys.stdin.readline
opt = sys.stdout.write
n, quest_list, board, dp = init()
for i in range(1, n):
    for j in range(1, n):
        dp[i][j] = board[i][j] +  dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1]
for y1, x1, y2, x2 in quest_list:
    y1, x1, y2, x2 = y1-1, x1-1, y2-1, x2-1
    result = dp[y2][x2]
    if y1-1 >= 0:
        result -= dp[y1-1][x2]
    if x1-1 >= 0:
        result -= dp[y2][x1-1]
    if y1-1 >= 0 and x1-1 >= 0:
        result += dp[y1-1][x1-1]
    opt(f'{result}\n')
profile
Frontend 개발자입니다.

0개의 댓글