ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 13398. [Python]연속합 2
    Python_알고리즘/Gold V 2025. 3. 16. 22:52

    1. 문제

     

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

     

    2. 접근 방법

     

    • 시간 제한: 2초
    • 메모리 제한: 512MB
    • 다이나믹 프로그래밍

     

    3. 파이썬 코드

     

    N = int(input())
    num_list = list(map(int,input().split()))
    
    # 문제에서 최소 한 개 이상의 수를 선택해야기 때문에 N이 1인 경우 예외처리 진행
    if N == 1:
        print(num_list[0])
    # N이 2개 이상인 경우
    else:
        # 첫 누적합을 구할 리스트를 생성
        dp = [0] * N
        # 누적합을 구하기 위한 리스트는 첫 인덱스 값으로 선언
        dp[0] = num_list[0]
        # 1번 인덱스부터 N 까지 반복
        for i in range(1,N):
            # 현재 값에 i 인덱스 값을 초기값 선언
            dp[i] = num_list[i]
            # 그 자리에 이전값 + 현재 값, 현재 자리값을 비교해서 max 값 저장
            dp[i] = max(dp[i-1]+num_list[i], num_list[i])
        # 수를 1개를 제외한 경우리스트 생성
        answer = [0] * N
        # 이 값또한 0번 인덱스로 선언해줘야 함
        answer[0] = num_list[0]
        # 1개의 수를 제외한 경우를 반복문 진행하면서 체크
        for i in range(1,N):
            answer[i] = max(dp[i-1],answer[i-1]+num_list[i])
        # 두 리스트에서 max 값을 찾아서 출력
        print(max(max(dp),max(answer)))

     

    4. 문제를 풀고난 후 생각

     

    • 누적 합을 응용한 문제의 느낌으로 모든 값들에 대해서 이전값을 더한것과 현재 자리의 값을 비교해 큰값을 메모제이션 처리한 후 한 자리씩 그 값을 제외했을때 나올 수 있는 최적의 값을 찾는 문제였다.
    • 초기 값 선언에 대해서 answer 리스트에 선언을 하지 않을 경우 값이 제대로 출력되지 않는 경우가 있기 때문에 모든 초기 0번 인덱스를 첫 값으로 선언해줘야 문제가 해결된다.

     

    5. 문제를 푸는데 도움이 되는 지식

     

    • 다이나믹 프로그래밍

    'Python_알고리즘 > Gold V' 카테고리의 다른 글

    3980. [Python]선발 명단  (1) 2024.10.21
    1469. [Python]숌 사이 수열  (0) 2024.10.08
    14719. [Python]빗물  (0) 2024.09.30
    2294. [Python]동전 2  (1) 2024.09.05
    2293. [Python]동전 1  (0) 2024.09.05

    댓글

Designed by Tistory.