on
Baekjoon1912: 연속합
Baekjoon1912: 연속합
연속합
시간 제한메모리 제한제출정답맞은 사람정답 비율
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
from http://devyoseph.tistory.com/124 by ccl(A) rewrite - 2021-10-31 04:02:15