[백준 1912][파이썬] 연속 합

2023. 1. 13. 12:00·백준 알고리즘/dp
728x90

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

 

1912번: 연속합

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

www.acmicpc.net

연속된 몇 개의 정수를 골라 합이 가장 큰 값을 구해야한다.

 

일단 가장 간단한 알고리즘을 생각해보면 이중 반복문으로 모든 연속된 부분 수열의 합을 구하는 것이다.

 

물론 이 방법으로 구현하게 되면 시간 초과가 발생한다.

 

조금 더 시간을 단축하는 알고리즘을 사용해야한다.

 

일단 기본적으로 dp[i]에 입력받은 수열의 인덱스 0부터 i까지의 부분 수열의 합을 저장한다.

 

이렇게 구하다가 어느 조건을 만족하면 인덱스의 시작 위치를 바꿔서 dp[i]에 바뀐 시작 위치부터 i까지의 합을 저장해야한다.

 

이러한 조건을 찾아야한다.

 

처음 생각한 조건은 다음과 같다.

 

음수가 존재하는 인덱스를 기준으로 시작 위치를 바꾼다.

 

부분 수열이 모두 양수일 경우 무조건 길이가 길어야 최댓값이 나오기 때문에 이렇게 생각을 했다.

 

그러나 음수를 포함시키더라도 앞 뒤로 연속되어있는 부분 수열의 합이 최댓값이 나올 수도 있다.

 

예를 들어 (10, 6, -4, 5)라는 수열이 존재한다고 하면 (10, 6)의 합은 16이고 (10, 6, -4, 5)의  합은 17이다.

 

이러한 점을 고려하면 시작 위치를 바꾸는 조건은 다음과 같이 설정해야한다.

 

i까지의 합이 수열의 인덱스 i에 해당하는 값보다 작을 때 시작 위치를 바꾼다.

 

즉 i까지의 합이 수열의 인덱스 i에 해당하는 값보다 작다면 이 부분수열을 이어붙이는 것이 오히려 값을 작게 만든다.

 

그 인덱스 i부터 시작해서 다시 합을 구해야한다.

 

이렇게 구한 dp 리스트에서 가장 큰 값이 답이 된다.

 

위 조건을 좀 더 직관적으로 바꾸면 아래와 같다.

 

i-1까지의 합이 0보다 작을 때 시작 위치를 바꾼다.
n=int(input())
dp=list(map(int, input().split()))
for i in range(1, n):
    if dp[i-1]>0:
        dp[i]+=dp[i-1]
print(max(dp))

 

 

728x90

'백준 알고리즘 > dp' 카테고리의 다른 글

[백준 2839][파이썬] 설탕 배달  (0) 2023.01.23
[백준 1699][파이썬] 제곱수의 합  (0) 2023.01.14
[백준 11055, 11722, 11054][파이썬] 증가, 감소하는 수열 dp 문제  (0) 2023.01.11
[백준][파이썬] 쉬운 계단 수 10844  (0) 2023.01.09
[백준][파이썬] 알고리즘 문제 풀이 용 파이썬 문법 (업데이트 중)  (0) 2023.01.08
'백준 알고리즘/dp' 카테고리의 다른 글
  • [백준 2839][파이썬] 설탕 배달
  • [백준 1699][파이썬] 제곱수의 합
  • [백준 11055, 11722, 11054][파이썬] 증가, 감소하는 수열 dp 문제
  • [백준][파이썬] 쉬운 계단 수 10844
웅대
웅대
알고리즘과 백엔드를 중심으로 열심히 공부 중입니다! 같이 소통하며 공부해요!
    250x250
  • 웅대
    웅대 개발 블로그
    웅대
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 백준 알고리즘
        • dp
        • 문자열
        • 정렬
        • 스택
        • 브루트 포스
        • 이진 탐색
        • 정리
        • 우선순위 큐
        • 자료구조
        • 그래프
        • 기타
        • 그리디
      • 컴퓨터 언어
        • Kotlin
        • Python
        • C#
      • 공부
        • Database
        • Android Studio
        • Algorithm
        • 컴퓨터 구조론
        • Spring
        • lombok
        • AWS
        • Network
        • OS
        • Git & GitHub
        • AI
        • Computer Vision
        • 보안
        • Nginx
        • 프론트
        • express
        • GCP
        • grokking concurrency
        • DevOps
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    스택
    bfs
    ChatPromptTemplate
    RNN
    AWS Lambda
    nn.RNN
    parametric search
    code tree
    embedding
    Merge
    푸쉬 알람
    다익스트라
    influxDB CLI
    binary search
    Vector Store
    스프링 OAuth2
    codetree
    openvidu 배포
    파이썬
    ci/cd
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
웅대
[백준 1912][파이썬] 연속 합
상단으로

티스토리툴바