코딩테스트

백준 5430번 AC C++ 풀이

5_솔방울 2022. 11. 22.

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

 

5430번: AC

각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.

www.acmicpc.net

선영이는 주말에 할 일이 없어서 새로운 언어 AC를 만들었다. AC는 정수 배열에 연산을 하기 위해 만든 언어이다. 이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다.

 

주말에 할 게 없다고 새로운 언어를 만들어 버린 선영이를 위해 초기값과 수행할 함수가 주어졌을 때 언어의 연산을 거친 최종 결과를 구하는 프로그램이다.

문제 설명

이 언어의 함수는 R, D가 있는데, R은 문자열을 뒤집는 함수, D는 문자열의 첫 번째 수를 버리는 함수이다.

문제의 포인트

수행할 함수의 수와 문자가 정말 상당히 길기 때문에, Deque를 이용해야한다는 아이디어를 떠올려야 한다.

또한 앞뒤를 따져 미리 문자를 버려놓고 후에 문자열을 뒤집는 작업을 하면 그때그때 문자열을 뒤집어 시간을 낭비하는 행위를 방지할 수 있다. 문자열을 뒤집는 횟수를 bool로 저장해 놓는 것도 포인트이다.

코드

#include<iostream>
#include<deque>
#include<algorithm>
#include<string>
using namespace std;
int t, n;
string strp, strn;
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	cin >> t;
	while (t--)
	{
		cin >> strp;
		cin >> n;
		cin >> strn;
		deque<int> dq;
		bool flag = true; //error
		bool dir = true; //정방향 역방향
		string temp = "";
		for (int i = 1; i < strn.size(); i++) //string to deque
		{
			if (strn[i] == ',' || strn[i] == ']')
			{
				if (temp != "")
				{
					dq.push_back(stoi(temp));
					temp = "";
				}
			}
			else
			{
				temp += strn[i];
			}
		}
		for (int i = 0; i < strp.size(); i++)
		{
			if (strp[i] == 'R')
			{
				dir = !dir;
			}
			else if (strp[i] == 'D')
			{
				if (dq.empty())
				{
					flag = false;
					break;
				}
				else//출력
				{
					if (dir) dq.pop_front();
					else dq.pop_back();
				}
			}
		}
		if (!flag) cout << "error\n";
		else
		{
			if (!dir) reverse(dq.begin(), dq.end());
			cout << "[";
			for (int i = 0; i < dq.size(); i++)
			{
				if (i == dq.size() - 1) 
					cout << dq[i];
				else
					cout << dq[i] << ",";
			}
			cout << "]\n";
		}
	}
}

여담

이 문제도 전에 풀었던 것인데, 정리를 하려니 복습도 되고 좋다. 솔직히 미리 해놓았다면 어떨까 하는 생각도 든다..^^

댓글