이번 포스팅에서 다뤄볼 내용은 구간 합입니다. 여기서 구간 합이란, 기존 배열을 합 배열로 바꾸어 시간 복잡도를 줄이는 알고리즘을 뜻합니다. 구간 합은 코딩 테스트에서 매우 유용하기 때문에 꼭 알아두어야 하는 중요한 내용입니다.
구간 합의 기본적인 아이디어는 i번째 원소에서 j번째 원소까지의 합을 구하기 전에 먼저 주어진 배열을 합 배열로 바꾸자는 것입니다.
이 때, 0번 index의 원소를 0으로 설정하는 이유는 i와 j가 1부터 시작하는 숫자이기 때문입니다. 이렇게 완성된 합 배열의 j번째 원소에서 i-1번째 원소를 빼면, O(1) 시간만에 i번째부터 j번째까지의 원소의 합을 구할 수 있습니다.
import sys
input = sys.stdin.readline
data_count, query_count = map(int, input().split())
num_array = list(map(int, input().split()))
sum_array = [0] # 0번 인덱스의 원소를 0으로 설정
sum = 0
for i in num_array:
sum += i
sum_array.append(sum) // append에 연산은 넣을 수 없다. 즉, append(sum += i)는 불가능하다.
for i in range(query_count):
start,end = map(int, input().split())
print(sum_array[end] - sum_array[start-1])
① input = sys.stdin.readline
② data_count
③ query_count
④ num_array
⑤ sum_array
import sys
input = sys.stdin.readline
arr_size, query_count = map(int, input().split())
arr = [[0] * (arr_size + 1)]
sum_arr = [[0] * (arr_size + 1) for _ in range(arr_size + 1)]
for i in range(arr_size):
arr_row = [0] + [int(x) for x in input().split()]
arr.append(arr_row)
for i in range(1, arr_size + 1):
for j in range(1, arr_size + 1):
sum_arr[i][j] = sum_arr[i-1][j] + sum_arr[i][j-1] - sum_arr[i-1][j-1] + arr[i][j]
for i in range(query_count):
x1, y1, x2, y2 = map(int, input().split())
result = sum_arr[x2][y2] - sum_arr[x1-1][y2] - sum_arr[x2][y1-1] + sum_arr[x1-1][y1-1]
print(result)
① arr = [[0] * (arr_size + 1)]
② sum_arr = [[0] * (arr_size + 1) for _ in range(arr_size + 1)]
③ arr_row = [0] + [int(x) for x in input().split()]
④ 이중 for문
sum_arr[i][j] = sum_arr[i-1][j] + sum_arr[i][j-1] - sum_arr[i-1][j-1] + arr[i][j]
⑤ result 계산
sum_arr[x2][y2] - sum_arr[x1-1][y2] - sum_arr[x2][y1-1] + sum_arr[x1-1][y1-1]
import sys
input = sys.stdin.readline
arr_size, division = map(int, input().split())
arr = list(map(int, input().split()))
sum_arr = [0] * arr_size # 초기화
count_arr = [0] * division # 초기화
sum_arr[0] = arr[0] # 0번째 원소까지의 합 = 0번 원소의 값
result = 0
for i in range(1, arr_size):
sum_arr[i] = sum_arr[i-1] + arr[i] # 합 배열
for i in range(arr_size):
remainder = sum_arr[i] % division
if remainder == 0:
result += 1 # 파이썬에서는 ++연산자를 지원하지 않음
count_arr[remainder] += 1
for i in range(division):
if count_arr[i] > 1:
result += (count_arr[i] * (count_arr[i]-1) // 2)
print(result)
① count_arr
② remainder == 0인 경우
③ remainder != 0인 경우
④ result 계산