N개의 정수를 담고 있는 배열이 주어졌을 때, 여기서 가능한 연속 부분합을 구하는 프로그램을 작성하라.
여기서 연속 합이라는 것은 배열에서 연속된 숫자들을 선택해서 합하였을 때의 값을 말한다.
아무 배열도 택하지 않는 경우도 연속된 배열합에 포함됨을 유의하자.
입력의 첫 번째 줄에는 정수 N(1≤N≤105)가 입력된다. 그리고 그 다음 줄에는 N개의 배열에 담긴 숫자가 순서대로 입력된다.
숫자의 범위는 -100이상 100이하의 정수다.
입력에 대한 가장 큰 연속 부분합을 출력한다.
4
1 2 -2 4
5
단순하게 생각하면 최소일 때 원소의 개수가 1개인 부분집합에서 최대일 때 원소의 개수가 모든 원소인 부분집합의 합 중 최댓값을 찾는 문제인 것 같습니다. 그렇다면 일단 입력을 배열(혹은 벡터 등)에 저장한 뒤 1개에서 최대 개수가 될 때 까지 더한 합을 비교하면 될 것 같습니다.
실행 결과, 5개는 통과하지만 나머지 5개가 시간 초과가 되는군요. 그렇다면 속도를 어떻게 빠르게 만들지 고민 해 봐야할 것 같습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include<iostream>
usingnamespacestd;
int GetMaxByInterval(int* arr, int n, int interval);
int main()
{
int n;
cin>> n;
int*arr =newint[n];
// 입력되는 원소들을 저장한다.
for (int i =0; i < n; ++i)
{
cin>> arr[i];
}
// 각 간격 별 최댓값을 구해 전체 간격 중 가장 큰 값을 찾는다.
int totalMax{ -2100000000 };
for (int i =1; i <= n; ++i)
{
int currentMax{ GetMaxByInterval(arr, n, i) };
if (totalMax < currentMax)
{
totalMax = currentMax;
}
}
cout<< totalMax <<endl;
delete[] arr;
}
// 간격 별 최댓값을 구해 리턴하는 함수
int GetMaxByInterval(int* arr, int n, int interval)