문제
11052번: 카드 구매하기
첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000)
www.acmicpc.net
알고리즘
- 반복문을 통해 각 카드 개수의 지불하는 최대 금액을 구한다.
- 각 카드의 개수의 지불하는 최대 금액과 이전의 카드를 지불한 최대 금액 + 현재 카드팩 가격을 비교한다.
예를 들어, 예제 입력 1을 예시로 두어 코드를 수행하면 다음과 같다.
dp[1] = p[1]
dp[2] = dp[1] + p[1] or dp[0] + p[2]
dp[3] = dp[2] + p[1] or dp[1] + p[2] or dp[0] + p[3]
dp[4] = dp[3] + p[1] or dp[2] + p[2] or dp[1] + p[3] or dp[0] + p[4]
코드
import sys
n = int(sys.stdin.readline())
p = [0] + list(map(int, sys.stdin.readline().split()))
dp = [0] * (n + 1)
# 반복문을 통해 각 카드 개수의 지불하는 최대 금액을 구한다.
for i in range(1, n + 1):
for j in range(1, i + 1):
# 현재 카드를 지불하는 최대 금액과 이전의 카드를 지불한(i - j) 최대 금액 + j개가 들어있는 카드팩 가격을 비교
dp[i] = max(dp[i], dp[i - j] + p[j])
print(dp[n])
github
GitHub - junjange/CodingTest: 내가 푼 코딩 테스트 문제와 해결법
내가 푼 코딩 테스트 문제와 해결법. Contribute to junjange/CodingTest development by creating an account on GitHub.
github.com
'CodingTest > Baekjoon' 카테고리의 다른 글
[baekjoon] 백준 9465번(파이썬): 스티커 (0) | 2021.12.05 |
---|---|
[baekjoon] 백준 1904번(파이썬): 01타일 (0) | 2021.12.04 |
[baekjoon] 백준 1010번(파이썬): 다리 놓기 (0) | 2021.12.02 |
[baekjoon] 백준 14501번(파이썬): 퇴사 (0) | 2021.12.02 |
[baekjoon] 백준 9461번(파이썬): 파도반 수열 (0) | 2021.11.30 |