[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개의 댓글

관련 채용 정보