본문 바로가기
Problem Solving/Prefix Sum, Cumulative Sum

[누적합] 백준 11660번: 구간 합 구하기 5 / 실버 1

by ggyongi 2021. 7. 26.
반응형

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
n, m = map(int, input().split())
table = []
for i in range(n):
    row = list(map(int, sys.stdin.readline().split()))
    for j in range(1, n):
        row[j] += row[j-1]
    table.append(row)

for x in range(1, n):
    for y in range(n):
        table[x][y] += table[x-1][y]

for i in range(m):
    x1, y1, x2, y2 = map(int, sys.stdin.readline().split())
    init = table[x2-1][y2-1]
    if x1 != 1 and y1 != 1:
        table[x2 - 1][y2 - 1] += table[x1 - 2][y1 - 2]
    if x1 != 1:
        table[x2 - 1][y2 - 1] -= table[x1-2][y2-1]
    if y1 != 1:
        table[x2 - 1][y2 - 1] -= table[x2-1][y1-2]
    print(table[x2-1][y2-1])
    table[x2-1][y2-1] = init

이 문제가 오래 걸린 이유는 시간 초과 때문인데 그 밖에 여러가지 문제점이 있었다.

 

1. 푸는 방식이 바로 떠오르지 않음 -> 어떤 방법이 제일 효율적일까 바로 떠오르지 않음

 

2. 제일 마지막 반복문 도는 부분에서 여러 케이스를 나눠서 했는데 이부분이 엄청 헷갈림. 이 여러개 if문 확인을 안하게 할 수 있는 방법이 있는데, 테이블을 만들때 n*n이 아니라 n+1*n+1로 만들어서 첫째 열, 행을 0으로 초기화 해주면 된다. 그럼 인덱스가 -1이 돼서 마지막 배열값을 읽어오는 불상사를 사전에 방지할 수 있다.

 

 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글