본문 바로가기
Problem Solving/BOJ

[BOJ][Python]11660번 풀이

by NoiB 2022. 7. 31.
반응형

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
ssr = sys.stdin.readline

n,m = map(int, ssr().split())
num = [list(map(int, ssr().split())) for _ in range(n)]
dp = [[0 for _ in range(n)] for _ in range(n)]
for i in range(n):
    dp[i][0] = num[i][0]
    for j in range(1,n):
        dp[i][j] += num[i][j] + dp[i][j-1]
for _ in range(m):
    x1,y1,x2,y2 = map(int, ssr().split())
    ans = 0
    for i in range(x1-1,x2):
        if y1-2 < 0:
            ans += dp[i][y2-1]
        else:
            ans += dp[i][y2-1] - dp[i][y1-2]
    print(ans)

이번 문제는 좀 아슬아슬하게 통과했네요. 데이터양이 조금 더 많으면 시간초과가 날 것 같습니다.

 

문제 접근은 dp와 누적 합입니다. 누적 합 문제는 클래스 4 정도에 오셨다면 한 번 이상은 경험해보셨을 것 같은데요. 이번 문제는 제 입장에서는 처음으로 2차원 배열로 주어진 누적합 문제입니다. 근데 뭐 크게 다를 건 없었습니다. 오히려 혼자서 꼬아서 생각하느라 약간 시간을 낭비했구요. 각 행 별로 따로 누적합을 진행해주면 되었습니다. 그리고 마지막에 반복문으로 조건에 맞는 만큼 더하고 빼주면 됐네요. 인덱스 에러를 방지하기 위해서  y1의 범위를 정해줬습니다(에러가 안나더라도 원하지 않는 값이 되어서 결과가 달라집니다). 

반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ][Kotlin]22193 풀이  (0) 2022.11.14
[BOJ][Kotlin]14928번 풀이  (0) 2022.11.14
[BOJ][Python]9465번 풀이  (0) 2022.07.30
[BOJ][Python]1991번 풀이  (0) 2022.07.29