연속합
시간 제한메모리 제한제출정답맞은 사람정답 비율
1 초 (추가 시간 없음) | 128 MB | 90176 | 29770 | 20571 | 31.853% |
문제
n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇 개의 수를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 한다. 단, 수는 한 개 이상 선택해야 한다.
예를 들어서 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 이라는 수열이 주어졌다고 하자. 여기서 정답은 12+21인 33이 정답이 된다.
입력
첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
출력
첫째 줄에 답을 출력한다.
풀이
왼쪽부터 숫자를 계속 더해나가기 시작한다. 합의 최대값을 계속 기록하면서 누적합이 음수가 되었을 때 합을 0으로 초기화한다.
이렇게 하는 이유는 현재까지의 합이 음수가 되는 순간 오른쪽 항과 더할 필요가 없기 때문이다.
예제 1번을 예시로 구체화하면 다음과 같다. 아래에는 sum 변수에 저장되는 합을 나타낸다
10 | -4 | 3 | 1 | 5 | 6 | -35 | 12 | 21 | -1 |
10 | 6 | 9 | 10 | 15 | 21 | -14 | 12 | 21 | 32 |
sum은 계속 값을 저장하다가 -35를 만나 순간적으로 음수가 된다. 음수가 되는 순간 뒷항과 연결할 이유가 없으므로 0으로 초기화한다
제한조건
n의 최대수는 100,000이고 각 숫자의 최대값은 1000이다. 최대 기록될 수 있는 숫자는 100,000,000(1억)이고 int로 표현 가능하다
값 저장
여러 방법이 있겠지만 StringTokenizer로 가져오기로 했다. 값을 가져온 뒤 배열에 넣어주었다
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine()," ");
int[] arr = new int[n];
for(int i=0; i<n;i++) {
arr[i]=Integer.parseInt(st.nextToken());
}
int max=arr[0]; //최대값 시작은 0항의 값을 넣어준다
int sum=0;
for(int i=0; i<n;i++){
sum+=arr[i]; //현재항을 더한 뒤
max=Math.max(max, sum); //최대값이면 기록한다
if(sum<0) {
sum=0; //sum이 음수가 된 순간 초기화시켜준다
}
}
System.out.print(max);
}}
'Study > Baekjoon' 카테고리의 다른 글
Baekjoon11047: 동전 0 (0) | 2021.10.31 |
---|---|
Baekjoon12865: 평범한 배낭 (0) | 2021.10.31 |
Baekjoon1463*: 1로 만들기 (0) | 2021.10.30 |
Baekjoon1932: 정수 삼각형 (0) | 2021.10.30 |
Baekjoon2156: 포도주 시식 (0) | 2021.10.29 |