알고리즘 코딩테스트
[백준] 11660번 : 구간 합 구하기 5 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트
우당탕탕 개발자
2024. 1. 4. 15:29
728x90
반응형
11660번: 구간 합 구하기 5
첫째 줄에 표의 크기 N과 합을 구해야 하는 횟수 M이 주어진다. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000) 둘째 줄부터 N개의 줄에는 표에 채워져 있는 수가 1행부터 차례대로 주어진다. 다음 M개의 줄에는 네
www.acmicpc.net
1. 문제 설명
2. 풀이과정
질의의 개수가 100,000이므로 해당 문제는 질의마다 합을 구하면 안 되고, 구간 합 배열을 이용해야 한다.
표가 2차원이므로 구간 합 배열 또한 2차원 배열로 생성해야 한다.
해당 구간 합 배열을 어떻게 구성할 것인지 고민하는 것이 문제의 핵심이다.
S[X][Y] = 원본 배열의 (0, 0)부터 (X, Y)까지의 사각형 영역 안에 있는 수의 합
- 2차원 구간 합 배열의 1행, 1열부터 구한다.
- 구간 합 배열 1행 : S[i][j] = S[i][j - 1] + A[i][j]
- 구간 합 배열 1열 : S[i][1] = S[i - 1][1] + A[i][1]
- 위 식을 통해 나머지 2차원 구간 합 배열을 채운다. S[i][j] = S[i][j - 1] + S[i - 1][j] - S[i - 1][j - 1] + A[i][j]
- 예를 들어 질의 가 2 2 3 4라면 (3, 4) 구간 합에서 (1, 4) 구간 합, (3, 1) 구간 합을 뺀 다음 중복하여 뺀 (1, 1) 구간 합을 더한다.
슈도코드
- N(리스트 크기), M(질의 수)
- A(원본 리스트)
- S(구간 합 배열)
- for n만큼 반복 : 원본 리스트 데이터 저장
- for i를 1부터 N까지 반복
- for j를 1부터 N까지 반복
- 합 배열 저장 S[i][j] = S[i - 1][j] + S[i][j - 1] - S[i - 1][j - 1] + A[i][j]
- for M만큼 반복
- startR, startC, endR, endC
- 질의에 대한 결과 계산 S[endR][endC] - S[startR - 1][endC] - S[endR][startC - 1] + S[startR - 1][startC - 1]
반응형
3. 소스코드
import sys
N, M = map(int, sys.stdin.readline().split())
A = [[0] * (N + 1)]
for _ in range(N):
li = [0] + [int(x) for x in sys.stdin.readline().split()]
A.append(li)
S = [[0] * (N + 1) for _ in range(N + 1)]
for i in range(1, N + 1):
for j in range(1, N + 1):
S[i][j] = S[i - 1][j] + S[i][j - 1] - S[i - 1][j - 1] + A[i][j]
for _ in range(M):
startR, startC, endR, endC = map(int, sys.stdin.readline().split())
result = S[endR][endC] - S[startR - 1][endC] - S[endR][startC - 1] + S[startR - 1][startC - 1]
print(result)
728x90
반응형