[boj] (s1) 11052 카드 구매하기

강신현·2022년 4월 19일
0

✅ DP

문제

링크

1. 문제 접근 및 해결 로직

f(N)f(N) : NN개의 카드를 살 때의 최대 금액,
price[N]price[N] : NN번째 카드팩의 가격 이라고 하자.

  • N=1N=1
    price[1]price[1]

  • N=2N=2
    =1+1
    =2
    둘 중에 총 금액이 큰 경우
    f(2)=max(f(1)+f(1),price[2])f(2)=max(f(1)+f(1),price[2])

  • N=3N=3
    =1+1+1
    =1+2
    =3
    셋 중에 총 금액이 큰 경우
    f(3)=max(f(1)+f(1)+f(1),f(1)+f(2),price[3])f(3)=max(f(1)+f(1)+f(1),f(1)+f(2),price[3])

  • N=4N=4
    =1+1+1+1
    =1+1+2
    =2+2
    =1+3
    =4
    셋 중에 총 금액이 큰 경우
    f(4)=max(f(1)+f(1)+f(1)+f(1),f(1)+f(1)+f(2),f(2)+f(2),f(3)+f(1),price[4])f(4)=max(f(1)+f(1)+f(1)+f(1),f(1)+f(1)+f(2),f(2)+f(2),f(3)+f(1),price[4])

이런 식인데 규칙을 찾기가 너무 어렵다..
다른 문제들 처럼 맨 마지막을 기준으로 앞의 값을 이용하는 쪽으로 생각해보자.

1) 마지막에 1개짜리 카드팩을 구매하는 경우
마지막에 1개짜리 카드팩을 구매한다고 가정하면, 그 전에서 N-1개의 카드를 구매해야 하고, 이를 식으로 나타내면 f[N1]+price[1]f[N-1] + price[1] 이 된다.
2) 마지막에 2장짜리 카드팩을 구매하는 경우
마지막에 2개짜리 카드팩을 구매한다고 가정하면, 그 전에서 N-2개의 카드를 구매해야 하고, 이를 식으로 나타내면 f[N2]+price[2]f[N-2] + price[2]가 된다.
...
N) 마지막에 N장짜리 카드팩을 구매하는 경우
마지막에 N개짜리 카드팩을 구매한다고 가정하면, 그 전에서 N-N개의 카드를 구매해야 하고, 이를 식으로 나타내면 f[NN]+price[N]f[N-N] + price[N] 이 되게 된다.

최대비용을 구해야 하므로, 마지막에 카드를 1장 사는 것 부터 최대 N장 사는 모든 경우 중에 최댓값을 구해야 한다.

  • 정의
    f(N)f(N) : NN개의 카드를 살 때의 최대 금액
    f(N)f(N) : NN번째 카드팩의 가격
  • 구하는 답
    max(f[N1]+price[1],f[N2]+price[2],...,f[NN]+price[N])max(f[N-1] + price[1], f[N-2] + price[2],...,f[N-N] + price[N])
  • 초기값
    f(1)=price[1]f(1)=price[1]
  • 점화식
    f[Ni]+price[i]f[N-i] + price[i]

2. 코드

3. 시간 복잡도 분석

경우의 수를 모두 구하므로
O(N)O(N)

4. 문제에서 중요한 부분

DP문제는 점화식을 도출하는 것이 중요하다.
Bottm Up(반복문)으로 풀지 Top Down(재귀)으로 풀지는 선택사항

profile
땅콩의 모험 (server)

0개의 댓글