[BOJ] 20413 MVP 다이아몬드 (python)

윤형준·2022년 6월 27일
0

Baekjoon

목록 보기
2/5
post-thumbnail

문제

입력 제한 외 난이도에 따른 문제의 차이는 없다.

상민이는 게임 단풍잎이야기에 과금을 즐겨 한다. 단풍잎이야기에는 과금액에 따라 혜택을 제공하는 'MVP 등급'이 존재한다.

MVP 등급은 브론즈(B), 실버(S), 골드(G), 플래티넘(P), 다이아몬드(D)로 총 다섯 등급이 있으며, 현재 달과 지난달, 즉 현재 달을 포함한 최근 2개월간의 과금액으로 결정된다.

단, 단풍잎이야기에는 과도한 과금을 막기 위해 '최대 과금 한도'가 있어 한 달에 최대 다이아몬드 등급 기준액 까지만 과금할 수 있으며, 만원 단위로만 과금이 가능하다.

MVP 등급은 해당 달이 끝날 때 계산되어 책정된다. 예를 들어 아래의 표와 같은 등급 기준액을 따르고 1월에 게임을 시작한 상민이가 1월에 30만, 2월에 20만, 3월에 50만 원을 과금했다면 1월(30만)과 2월(30+20=50만)에는 실버 등급, 3월(20+50=70만)에는 골드 등급으로 책정된다.

MVP 등급(표기) 등급 기준액 2개월 간의 과금액
브론즈(B) 0만 원 0 원 ~ 29만 원
실버(S) 30만 원 30만 원 ~ 59만 원
골드(G) 60만 원 60만 원 ~ 89만 원
플래티넘(P) 90만 원 90만 원 ~ 149만 원
다이아몬드(D) 150만 원 150만 원 이상
<표1> 위 예시의 등급 기준표 (예제1)

상민이는 게임을 시작하고 N개월 동안 수많은 현금을 과금해왔다. 상민이는 이 사실을 자신의 여자친구에만큼은 철저히 비밀로 하고 있었다. 상민이의 여자친구는 상민이가 게임에 과금하는 것을 매우 싫어했기 때문이다. 그러던 어느 날 문제가 발생했다. 상민이의 여자친구에게 N개월간의 MVP 등급 기록이 유출된 것이다!

상민이의 여자친구는 상민의 과금액을 역추적하기 위해 당신에게 부탁했다.

상민이의 여자친구: 상민이가 게임에 최대 얼마나 과금한건지 알려줘.

둘 사이에 어떤 일이 벌어질지는 모르겠지만, 당신은 상민이의 여자친구를 위한 프로그램을 작성해야만 한다.

입력

첫 번째 줄에는 게임을 플레이 한 개월수 N이 주어진다.

두 번째 줄에는 실버, 골드, 플래티넘, 다이아몬드 등급 기준액 s, g, p, d가 만원 단위로 순서대로 주어진다. 브론즈 등급 기준액은 0 원이다.

세 번째 줄에는 게임을 플레이 한 첫 번째 달부터 N 번째 달까지의 MVP 등급이 등급 표기대로 주어진다. 기록과 같은 MVP 등급 달성이 불가능한 경우는 주어지지 않는다.

출력

입력된 MVP 등급을 달성하기 위한 최대 누적 과금액을 만원 단위로 출력한다.

제한

1 ≤ N ≤ 36

0 < s < g < p < d ≤ 500

상민이가 한번 달성한 MVP 등급은 줄어들지 않는다.


풀이

N = int(input())
standards = list(map(int, input().split()))
grades = input()

last = 0 # 지난 달 과금액
now = 0 # 이번 달 과금액
cnt = 0 # 과금액 최대 합

for grade in grades:
    if grade == 'B':
        now = standards[0]-1-last
        cnt += now
    elif grade == 'S':
        now = standards[1] - 1 - last
        cnt += now

    elif grade == 'G':
        now = standards[2] - 1 - last
        cnt += now

    elif grade == 'P':
        now = standards[3] - 1 - last
        cnt += now

    elif grade == 'D':
        now = standards[3]
        cnt += now
    last = now
print(cnt)

총 두 달의 과금액을 더해주는 간단한 구현(?) 그리디(?) 문제였다.

지난 달과 이번 달의 과금액을 계속 갱신해주면서 과금액의 최댓값을 구해야하므로

다음 grade로 넘어가기 직전까지 금액이 최대 과금액이다.

for문 마지막에 last 값을 now로 갱신해주면서 계속 cnt에 더해주는 방식으로 구했다.

Diamond 등급의 경우 다이아몬드 등급 기준액까지만 과금할 수 있기 때문에 now를 standards[3]으로 정확하게 더해준다. (이 값보다 더 많이 과금할 수 없음)

Diamond 등급이 연속된 달에는 최대 과금액을 구한다면 매달 Diamond 기준 금액을 더하면 되고 최솟값을 구한다면 Diamond 기준 금액과 0을 번갈아가며 더해주면 될 것이다.

  • 신한은행 코딩테스트 1번 문제와 유사한 문제라고 나와있어서 풀어보게 되었다.
profile
매일 조금씩 성장하는 개발자

0개의 댓글