Computer Science/Algorithm Problem

백준] 2037 - 문자메세지(ACM-ICPC Regionals)

TwinParadox 2018. 5. 5. 13:51
728x90

시간 제한 : 2초

메모리 제한 : 128MB




입력

첫째 줄에 p와 w가 주어진다. (1<=p,w<=1,000) p는 버튼을 한번 누르는데 걸리는 시간이고, w는 AC와 같은, 같은 숫자인 문자를 연속으로 찍기 위해 기다리는 시간을 의미한다. 그리고 둘째 줄에는 적을 문자열이 주어진다. 단, 이 문자열의 길이는 1000보다 작고, 맨 앞에 공백이 들어오는 경우는 없다고 가정하여도 좋다. 문자열은 알파벳 대문자와 띄어쓰기만으로 이루어져 있다.




출력

첫째 줄에 메시지를 적는데 걸리는 시간을 출력한다.




소스코드

#include <iostream>
#include <string>
using namespace std;
int main(void)
{
	int p, w;
	int len, prev = -1, sum = 0;
	string message;
	cin >> p >> w;
	cin.ignore();
	getline(cin, message);
	len = message.length();

	for (int i = 0; i < len; i++)
	{
		if (message[i] == ' ')
		{
			sum += p;
			prev = 1;
		}
		else if (message[i] >= 'A' && message[i] <= 'C')
		{
			sum += (prev == 2) ? w + (message[i] - 'A' + 1)*p : (message[i] - 'A' + 1) * p;
			prev = 2;
		}
		else if (message[i] >= 'D' && message[i] <= 'F')
		{
			sum += (prev == 3) ? w + (message[i] - 'D' + 1)*p : (message[i] - 'D' + 1)*p;
			prev = 3;
		}
		else if (message[i] >= 'G' && message[i] <= 'I')
		{
			sum += (prev == 4) ? w + (message[i] - 'G' + 1)*p : (message[i] - 'G' + 1) * p;
			prev = 4;
		}
		else if (message[i] >= 'J' && message[i] <= 'L')
		{
			sum += (prev == 5) ? w + (message[i] - 'J' + 1)*p : (message[i] - 'J' + 1)*p;
			prev = 5;
		}
		else if (message[i] >= 'M' && message[i] <= 'O')
		{
			sum += (prev == 6) ? w + (message[i] - 'M' + 1)*p : (message[i] - 'M' + 1)*p;
			prev = 6;
		}
		else if (message[i] >= 'P' && message[i] <= 'S')
		{
			sum += (prev == 7) ? w + (message[i] - 'P' + 1)*p : (message[i] - 'P' + 1)*p;
			prev = 7;
		}
		else if (message[i] >= 'T' && message[i] <= 'V')
		{
			sum += (prev == 8) ? w + (message[i] - 'T' + 1)*p : (message[i] - 'T' + 1)*p;
			prev = 8;
		}
		else
		{
			sum += (prev == 9) ? w + (message[i] - 'W' + 1)*p : (message[i] - 'W' + 1)*p;
			prev = 9;
		}
	}
	cout << sum;
}




Tip

단순 구현 문제로 문자열 처리만 잘해주면 쉽게 처리가 가능하다.공백은 키 입력 대기 시간이 없다는 것을 주의해야 한다.



728x90