반응형
Recent Posts
Recent Comments
«   2025/06   »
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
Today
Total
관리 메뉴

꿈꾸는 개발자의 devLog

[BaekJoon] "DP" - 백준 1912번 문제 : 연속합 본문

Algorithm/BaekJoon

[BaekJoon] "DP" - 백준 1912번 문제 : 연속합

덩화 2023. 12. 18. 16:49
반응형

[문제 설명]

https://www.acmicpc.net/problem/1912

 

1912번: 연속합

첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.

www.acmicpc.net

 

n개의 정수로 이루어진 임의의 수열이 주어짐

이 중 연속된 몇 개의 수를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 함 (단, 수는 한 개 이상 선택)

예제 입력)

10
10 -4 3 1 5 6 -35 12 21 -1

 

예제 출력 --> 12+21 = 33이 출력 되어야 함

 

[해결 로직]

이 문제는 dp 알고리즘으로 해결 가능함

처음에 코드를 작성할 때는 이중 반복문으로 코드를 작성하였는데, 

dp 알고리즘으로 반복문 한번만 실행하면 됨..

 

두 번째 요소 부터 현재 값과 현재값+이전값 을 비교하여 더 큰 값을 현재 값에 저장

이렇게 하면, 이전부터 숫자가 커질 때마다 합을 저장하게 됨

만약 이보다 작은 숫자가 나온다면? 더하지 않으면 됨 --> 연속적이지 않은것으로 의미

 

이렇게 해서 최종적으로 리스트에 저장된 가장 큰 값을 불러오면, 연속합 중 가장 큰 합의 수를 가져오는 것이 됨

 

[Solution 코드]

from collections import deque

n = int(input())
ary = list(map(int, input().split()))

## 그냥 이전합까지 계산한거를 현재 숫자랑 더하고, 더 큰 값을 넣으면 됨..
## 나만 어렵게 푼듯..내꺼는 반복문을 두번 돌아야 하니까나 시간 초과 난듯

for i in range(1, n):
    ary[i] = max(ary[i], ary[i] + ary[i-1])

print(max(ary))

 

반응형
Comments