Coding Test/BaekJoon_Python
백준 1912 <연속합> Python
JunOnJuly
2023. 11. 3. 19:57
728x90
https://www.acmicpc.net/problem/1912
1912번: 연속합
첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
www.acmicpc.net
처음에는 누적합 알고리즘으로 풀이를 시도했다가 시간이 부족해서 다른 방식으로 접근했습니다. DP 를 두 갈래로 나누어 썼는데, 현재 인덱스를 포함하는 최댓값을 기록하는 리스트와 그냥 최댓값을 기록하는 리스트 두 가지를 나누어 최댓값 리스트가 현재 인덱스를 포함하는 리스트를 비교하며 최댓값을 최신화하게 설계했습니다.
def solution(n, data_list):
# 인덱스 맞춰주기
data_list = [0] + data_list
# DP
memo = [0 for _ in range(100001)]
# 현재 인덱스를 포함한 최댓값
sub_memo = [0 for _ in range(100001)]
# memo 1 채우기
memo[1] = data_list[1]
sub_memo[1] = data_list[1]
# 탐색
for idx in range(2, n+1):
# 하나 전까지의 현재 인덱스를 포함하는 메모와 현재 인덱스의 값의 합
# 해당 인덱스의 값
# 둘 중 최대를 현재 인덱스를 포함하는 메모에 삽입
sub_memo[idx] = max(sub_memo[idx-1]+data_list[idx], data_list[idx])
# 현재 인덱스를 포함하는 메모의 값
# 전까지의 최댓값
# 둘 중 큰 값을 메모에 삽입
memo[idx] = max(sub_memo[idx], memo[idx-1])
return memo[n]
n = int(input())
data_list = list(map(int, input().split()))
print(solution(n, data_list))
728x90