ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 11052. [Python]카드 구매하기
    Python_알고리즘/Silver I 2024. 5. 20. 19:36

    1. 문제

     

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

     

     

    2. 접근 방법

     

    • 시간 제한: 1초
    • 메모리 제한: 256MB
    • DP(다이나믹 프로그래밍)

     

    3. 파이썬 코드

     

    # i 장을 구매하기 위한 최대값 계산 방법 접근
    
    N = int(input())
    # 카드 리스트 저장
    card_list = list(map(int,input().split()))
    # dp 시작
    dp = [0] * (N+1)
    # dp[1] 값 card_list[0] 으로 초기화
    dp[1] = card_list[0]
    # N+1 까지 반복문
    for i in range(2,N+1):
        # i 값까지 반복문 시행
        for j in range(1,i+1):
            # i 번 dp 에는 i 번째 카드를 구매하기 위해서 최대 값을 갱신해야함
            # i-j 의 경우 dp[i]의 카드를 구매하기 위해 최대값이 들어가있으므로 그 값 + card_list[j-1] 인덱스 값을 더해주면 dp[i] 에 저장된 값과 max 값을 비교하여 갱신해줌
            dp[i] = max(dp[i-j] + card_list[j-1], dp[i])
    
    print(dp[-1])

     

    4. 문제를 풀고난 후 생각

     

    • 카드를 구매하기 위해서 i 번째 인덱스에 i 번째 카드를 구매하기 위한 최대값을 저장하는 방식으로 접근함.
    • 1개 카드를 구매하기 위해서 1번에 들어갈 수 있는 max 값을 넣어둔 후 2개 카드를 구매하기 위해 들어갈 수 있는 최대값을 1개에서 구해 둔 값에서 2-1 인덱스 카드 값을 더해서 기존의 i 에 있는 값과 비교해 max 값을 갱신해 가는 구조이다.

    • 위 그림처럼 계속해서 장수가 쌓일수록 이전의 최대값을 가져와서 card[index] 를 더해가며 값을 갱신해준다.

     

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

     

    • DP(다이나믹 프로그래밍)

    'Python_알고리즘 > Silver I' 카테고리의 다른 글

    2531. [Python]회전 초밥  (0) 2024.06.30
    1105. [Python]팔  (0) 2024.06.20
    1932. [Python]정수 삼각형  (0) 2024.04.22
    1141. [Python] 접두사  (0) 2024.04.09
    11279. [Python]최대 힙  (0) 2024.01.09

    댓글

Designed by Tistory.