Baekjoon16194 - 카드 구매하기 2(Python)
백준 사이트 16194 - 카드 구매하기 2 문제입니다.
이 글을 보시기 전에 문제를 풀기 위해 충분한 생각을 하셨나요? 답을 안 보고 푸는게 최대한 고민하는게 가장 중요하다고 생각합니다.!!
☑️ 1. 문제
https://www.acmicpc.net/problem/16194
☑️ 2. Input , Output
☑️ 3. 분류 및 난이도
코딩테스트 준비-기초 : 브루트포스 - 다이나믹프로그래밍 문제입니다.
☑️ 4. 생각한 것들
- 크게 2가지 경우로 나눌 수 있습니다. 100팩을 구매한다고 할 때
- 들어온 값이 애초에 제일 적은 비용인 경우 (ex 100팩이 1원 )
- 그러지 않은 경우는 1팩 가격 + 99팩 가격 , 2팩 가격 + 98팩 가격 … 49팩 가격 + 51팩 가격.. 이런식으로 접근하면 됩니다.
팩의 개수는 최대 10,000이므로 최악의 경우 O(N^2)이라해도 1억이므로 시간내로 풀 수 있다고 생각하였습니다.
또한 범위를 전체 도는게 아닌, 범위의 절반만 도므로 위의 경우보다 더 짧겠지요.
5. code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from sys import stdin
n = int(stdin.readline())
def make_dp(size: int) -> list:
return [0 for _ in range(size + 1)]
def soultion(dp: list, price: list) -> None:
for i in range(1, len(price) + 1):
# 1번의 경우. 애초에 제일 적은 비용인 경우를 생각해 초기화
dp[i] = price[i - 1]
# 범위의 절반까지 돌면서 위의 점화식을 통해 계산.
for j in range(1, (i // 2) + 1):
dp[i] = min(dp[i], dp[j] + dp[i - j])
print(dp[n])
price = list(map(int, stdin.readline().split()))
dp = make_dp(len(price))
dp[1] = price[0]
soultion(dp, price)
6. 후기
- 문제에서 입출력 예제를 많이줘서 오답률이 높지는 않은듯 하네요.
c++로 작성이 필요하거나 도움이 필요하시면 댓글을 작성해주세요.!! 기록용이라 설명이 자세하지 않습니다.
This post is licensed under CC BY 4.0 by the author.