Algorithm/백준
[알고리즘]백준 11659번: 구간 합 구하기4
Im_light.J
2023. 2. 15. 17:02
728x90
알고리즘 유형: 누적 합
문제
수 N개가 주어졌을 때, i번째 수부터 j번째 수까지 합을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j가 주어진다.
출력
총 M개의 줄에 입력으로 주어진 i번째 수부터 j번째 수까지 합을 출력한다.
풀이
일정한 숫자의 배열이 주어지고 이에 대해서 특정 구간 i, j 사이에서 합을 구하는 문제였습니다.
sum 함수를 활용하여 계산을 진행하면, 반복 수(M)이 큰 경우 시간 복잡도 $O(N)$ 인 sum 함수를 계속 반복하므로
비효율적이며, 시간 초과가 발생하게 됩니다.
이를 방지하기 위해서 배열이 주어졌을 때 구간합을 미리 계산해둡니다.
아래에서 get_sum 함수를 통해 구간합의 정보를 바로 얻을 수 있는 배열을 만들었습니다
import sys
N, M =map(int, sys.stdin.readline().strip().split(" "))
nums = list(map(int,sys.stdin.readline().strip().split(" ")))
def get_sum(nums):
sum_nums =[]
num = 0
sum_nums.append(num)
for i in nums:
num+=i
sum_nums.append(num)
return sum_nums
nums = get_sum(nums)
for _ in range(M):
i, j = map(int,sys.stdin.readline().strip().split(" "))
print(nums[j]-nums[i-1])
728x90