Problem Solving/백준

[백준-20413] MVP 다이아몬드 (Easy)

문제

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

상민이는 게임 단풍잎이야기에 과금을 즐겨 한다. 단풍잎이야기에는 과금액에 따라 혜택을 제공하는 '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 등급은 줄어들지 않는다.

예제 입력 1 

3

30 60 90 150

BSG

예제 출력 1 

118

예제 입력 2 

10

257 269 367 500

BSGGGGPPDD

예제 출력 2 

2499


<Code>

//20413] MVP 다이아몬드 (Easy)
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
	
int main() {
	cin.tie(NULL); cout.tie(NULL);
	ios_base::sync_with_stdio(false);
	freopen("input.txt","rt", stdin);
	int n, res=0;
	cin>>n;
	vector<int> cutline(4);
	vector<char> rank(n);
	vector<int> sum(n+1);
	
	for(int i=0; i<4; i++){
		cin>>cutline[i];
	}
	for(int i=1; i<=n; i++){
		cin>>rank[i];
	}
	
	for(int i=1; i<=n; i++){
		if(rank[i]=='B'){
			sum[i]=cutline[0]-1-sum[i-1];
			
		}else if(rank[i]=='S'){
			sum[i]=cutline[1]-1-sum[i-1];
			
		}else if(rank[i]=='G'){
			sum[i]=cutline[2]-1-sum[i-1];
			
		}else if(rank[i]=='P'){
			sum[i]=cutline[3]-1-sum[i-1];
			
		}else if(rank[i]=='D'){
			sum[i]=cutline[3];
		}
	}
	
	for(int i=0; i<=n; i++){
		res+=sum[i];
	}
	cout<<res;
	return 0;
}

<Comment>

  • 등급 기준액을 입력받아서 cutline 벡터에 넣고, 등급기록도 char형 rank 벡터에 넣음.
  • 누적합을 저장할 sum 벡터도 선언.
  • for문을 1~n돌면서 rank[i]가 B/S/G/P/D인지에 따라 if문으로 분기처리를 해줌.
  • 입력받은 등급의 다음 등급컷보다 1작아야 최대가 될 수 있으므로 다음컷-1-이전값으로 계산해 sum에 넣음.
  • sum의 값을 모두 합해 출력.

https://www.acmicpc.net/problem/20413

 

20413번: MVP 다이아몬드 (Easy)

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

www.acmicpc.net

 

'Problem Solving > 백준' 카테고리의 다른 글

[백준-13458] 시험 감독  (0) 2021.08.18
[백준-14501] 퇴사  (0) 2021.08.14
[백준-22351] 수학은 체육과목 입니다 3  (0) 2021.08.09
[백준-20438] 출석체크  (0) 2021.08.09
[백준-21737 SMUPC 계산기]  (0) 2021.08.06