728x90
반응형
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
반응형
'알고리즘 코딩테스트' 카테고리의 다른 글
[백준] 12891번 : DNA 비밀번호 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2024.01.10 |
---|---|
[백준] 1253번 : 좋다 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2024.01.09 |
[백준] 1940번 : 주몽 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2024.01.08 |
[백준] 2018번 : 수들의 합 5 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2024.01.08 |
[백준] 10986번 : 나머지 합 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2024.01.07 |
[백준] 11659번 : 구간 합 구하기 4 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2024.01.04 |
[백준] 1546번 : 평균 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2024.01.04 |
[백준] 11720 : 숫자의 합 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2024.01.03 |