개인 공부 공간/Algorithm

BOJ(백준) 1912번 연속합 파이썬

Hoon Kang 2021. 3. 19. 12:39
 

1912번: 연속합

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

www.acmicpc.net


코드

import sys
r = sys.stdin.readline
N = int(r())
num = list(map(int,r().split()))
dp = [0] * N
dp[0] = num[0]
for i in range(1, len(num)):
    dp[i] = max(0, dp[i-1] + num[i])

ans = max(dp)
if ans==0:
    print(max(num))
else:
    print(ans)

 

해설

처음에는 2차원 배열 dp를 이용해 모든 경우의 수(매 시점마다)의 부분합을 구했으나 메모리 초과가 뜨는 바람에 해결하지 못했다. 어떻게 하면 필요한 값들만 효율적으로 저장할까에 대해 고민하다 위의 코드와 같이 하나씩 더해나가면서 그 시점의 부분합이 마이너스가 되는것을 방지하기 위해 max 를 이용해 그럴 경우 0을 저장하도록하였다. 마지막으로 기존 num 의 모든 값이 마이너스인 경우 최종 결과를 0으로 반환하는 문제점을 하기 위해 이 경우 num 리스트에서 최대값을 출력하도록 코드를 작성하였다.

 

결과

연속합결과.PNG