IT recording...

[BOJ] 11660 구간 합 구하기 5 - python 본문

Algorithm

[BOJ] 11660 구간 합 구하기 5 - python

I-one 2021. 12. 2. 21:10

11660번: 구간 합 구하기 5

 

11660번: 구간 합 구하기 5

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

www.acmicpc.net

풀이

  1. 계산이 최대 100,000번까지이기 때문에 다 계산하는건 사실상 불가
  2. 그렇다면 dp테이블을 이용해보자
  3. 00부터 특정 칸까지의 구간합을 이용할건데, 계산하는 범위가 맨 첫 줄부터가 아님
  4. → 한 row단위로 끊어서 빼서 계산하자
  5. 00을 포함할 때, 한 칸 일 때의 예외 처리
import sys
def input():
    return sys.stdin.readline().rstrip()

N, M = map(int,input().split(" "))
maps = [list(map(int,input().split(" "))) for _ in range(N)]
toCal = [list(map(int,input().split(" "))) for _ in range(M)]

# (0,0)부터 (N,N)까지의 합을 구해놓기
dp = [[0 for _ in range(N)]  for _ in range(N)]
dp[0][0] = maps[0][0]

for r in range(N):
    for c in range(N):
        if c == 0:
            dp[r][c] = dp[r-1][N-1] + maps[r][c]
        else:
            dp[r][c] = dp[r][c-1] + maps[r][c]

def calculate(cal):
    a,b,c,d = cal
    a -= 1 #00시작으로 맞추기
    b -= 1
    c -= 1
    d -= 1
    if a==c and b==d:
        return maps[a][b]
    sum = 0
    for row in range(a,c+1):
        if b == 0:
            sum += dp[row][d]
            if row != 0:
                sum -= dp[row-1][N-1]
        else:
            sum += dp[row][d] - dp[row][b-1]
    return sum

for cal in toCal:
    print(calculate(cal))

얻어가는 것

느낀점

"211113"

소요 시간 : 1h

'Algorithm' 카테고리의 다른 글

[BOJ] 2805 나무 자르기 - python  (0) 2021.12.02
[BOJ] 1062 가르침 - python  (0) 2021.12.02
[BOJ] 1339 단어 수학 - python  (0) 2021.12.02
[BOJ] 11659 구간 합 구하기 4 - python  (0) 2021.12.02
[BOJ] 2580 스도쿠 - python  (0) 2021.12.02
Comments