저도 고수가 아니지만 공부하는 분들 위해 올려봅니다.
sequence의 요소가 100만개 이기 때문에 매 순간마다 부분수열의 합을 구하는 2중 for문을 사용하는 방법으로
문제를 풀 경우 시간초과를 맞이하게 됩니다. (시간복잡도 O(N2))
따라서 우리는 부분수열의 합을 구할때 좀 더 효율적인 O(N)이나 O(NlogN)의 풀이를 생각해야합니다.
[3,4,5] => 3+4+5 = 12 // 문제의 답을 이렇게 표현 할 수도 있지만
( [1,2,3,4,5] 의 합 ) - ( [1,2] 의 합) => 15 - 3 = 12 // 이렇게도 표현할 수 있으며
( arr.slice(0,5) 합 ) - ( arr.slice(0,2) 의 합 )= 12 // 정리하면 이렇게 됩니다.
여기서 누적합 배열 prefix = [0, 1, 3, 6, 10, 15] 를 우리가 만들어놓는다면
정답은 prefix[5] - prefix[2] 로 표현할 수 있습니다.
이 특성을 이용하여 이제 우리는 arr의 길이가 100만이고 구해야하는 부분수열의 합의 갯수가 100만개라도 O(N)으로 해결가능해졌습니다.
아래는 누적합, 투포인터를 사용한 정답 코드입니다.