나를 기록하다
article thumbnail
반응형

연속합

시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 (추가 시간 없음)128 MB122894449413171535.207%

문제

n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇 개의 수를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 한다. 단, 수는 한 개 이상 선택해야 한다.

예를 들어서 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 이라는 수열이 주어졌다고 하자. 여기서 정답은 12+21인 33이 정답이 된다.

입력

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

출력

첫째 줄에 답을 출력한다.

예제 입력 1

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

예제 출력 1

33

예제 입력 2

10
2 1 -4 3 4 -4 6 5 -5 1

예제 출력 2

14

예제 입력 3

5
-1 -2 -3 -4 -5

예제 출력 3

-1

풀이

1)

n = int(input())
a = list(map(int,input().split()))
d = [0]*n
for i in range(n):
    d[i] = a[i]
    if i == 0:
        continue
    if d[i] < d[i-1] + a[i]:
        d[i] = d[i-1] + a[i]
print(max(d))
  1. 입력받은 n은 리스트 a의 길이를 나타냅니다.
  1. 리스트 a는 입력받은 숫자들을 저장하는 리스트입니다.
  1. 리스트 da 리스트의 각 원소를 누적하여 더한 부분합 중 가장 큰 값을 저장하는 리스트입니다. 따라서, d[i]a[0]부터 a[i]까지의 부분합 중 가장 큰 값을 의미합니다.
  1. for문을 통해 리스트 a를 순회하며, d 리스트에 값을 저장합니다.
  1. if문을 통해 d[i]가 이전까지의 부분합과 현재 원소 a[i]를 더한 값보다 작을 경우, d[i]를 이전까지의 부분합과 현재 원소 a[i]를 더한 값으로 업데이트합니다. 이는 d[i]가 이전까지의 부분합과 현재 원소 a[i]를 더한 값보다 작다면, d[i]를 현재 원소 a[i]로 초기화하지 않고 이전까지의 부분합과 현재 원소 a[i]를 더한 값으로 업데이트해야하기 때문입니다.
  1. for문을 마친 후, d 리스트에서 가장 큰 값을 출력합니다. 이는 a 리스트에서 부분합 중 가장 큰 값을 의미합니다.


Uploaded by N2T

반응형
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...