[C++] 백준 1912 - 연속합

메르센고수·2023년 8월 6일
0

Baekjoon

목록 보기
5/48

문제 - 연속합 (Silver2)

[백준 1912] https://www.acmicpc.net/problem/1912

소스 코드

#include <iostream>
using namespace std;

int main(void){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int N;
    cin>>N;

    int A[100000];
    int B[100000];

    for(int i=0;i<N;i++){
        cin>>A[i];
    }
    B[0]=A[0];
    int result=A[0];

    for(int i=1;i<N;i++){
        B[i]=max(B[i-1]+A[i],A[i]);
        result=max(result,B[i]);
    }
    cout<<result<<'\n';
}   

연속합 알고리즘

for(int i=1;i<N;i++){
    B[i]=max(B[i-1]+A[i],A[i]);    
    result=max(result,B[i]);
}

두 개의 배열을 선언하는데 하나는 (A) 숫자를 입력받는 배열, 다른 하나는 (B) 연속합을 저장하는 배열로 선언을 한다.

B[i]=max(B[i-1]+A[i],A[i]);

i번째 연속합을 저장하는 경우, i-1번째까지의 연속합을 저장한 배열의 원소와 입력한 i번째 원소의 합과, i번째 원소를 비교해서 둘중에 더 큰 수를 B배열의 i번째 위치에 저장한다.

result=max(result,B[i]);

출력할 결과는 A[0]로 초기화한 result값과 바로 위의 줄에서 비교한 연속합 B[i]와의 비교를 통해 더 큰 값을 결과로 출력한다.

예시

0123456789
a10-43156-351221-1
b1069101521-14123332

b만 살펴보면

B[0]=10
B[1]=max(10-4,-4)=6
B[2]=max(6+3,3)=9
B[3]=max(9+1,1)=10
B[4]=max(10+5,5)=15
B[5]=max(15+6,6)=21
B[6]=max(21-35,-35)=-14
B[7]=max(-14+12,12)=12
B[8]=max(12+21,21)=33
B[9]=max(33-1,-1)=32

따라서 이 값들 중 최댓값은 33이므로 result=max(result,B[i]) 에 의해 for 문이 종료될 때 result에 33이 저장되게 된다.

결과

profile
블로그 이전했습니다 (https://phj6724.tistory.com/)

0개의 댓글