Study/Baekjoon

Baekjoon1912: 연속합

devyoseph 2021. 10. 31. 03:36

연속합

시간 제한메모리 제한제출정답맞은 사람정답 비율

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