파이썬 알고리즘 문제풀이/누적합

BOJ 11659 - 구간 합 구하기 4

monsangter 2023. 4. 6. 06:51

 

백준에서 처음 풀어보는 문제..

일단 ide가 없어 굉장히 러프하고, 발상보다 시간복잡도, 알고리즘을 고려해야하는 문제이다.

 

언뜻 보면 굉장히 간단한 문제처럼 보인다. 하지만 제한사항에 n,m이 100,000 과 100,000 최악의 경우 시간복잡도가 오버될 수 있음을 볼 수 있다.

 

 

누적합을 배우기전 나의 답.

 

N, M = input().split()
ls1 = list(map(int,input().split()))
ls2 = []
sum1 = 0



for k in range(int(M)):
  i,j = input().split()
  sum1 = sum(ls1[int(i)-1:int(j)])
  ls2.append(sum1)

for i in ls2:
  print(i)

일단 백준이 처음이라 그런지 input에 대해 시간복잡도를 줄이는 법을 모르고 .. 

input을 받을떄 map을 활용해 int로 만드는 것도 미숙하다.

그리고 결정적으로 시간초과가 됐다.

import sys
input = sys.stdin.readline

N, M = map(int,input().split())
ls1 = list(map(int,input().split()))



for i in range(N-1):
    ls1[i+1] += ls1[i]
    
ls1 = [0] + ls1

for k in range(M):
    i,j = map(int,input().split())
    print(ls1[j]-ls1[i-1])

위의 오류를 수정한 결과.

 

[5,4,3,2,1]에서 합의 식을 만들때는 앞에 [0]을 붙여줬는데,

 

제한 조건을 보면 i,j의 범위가 서로 같을 수도 있음을 알 수 있다.

즉 1,1과 같은 범위를 합해 출력할때는 어떻게 될지 생각해보자.