Algorithm/백준

[백준] 5430 AC with C++

nowkoes 2023. 5. 19. 00:00

문제설명


입출력 예제


개념

 정수 배열을 AC 언어를 이용해 연산하는 문제다. 이때 입력이 대괄호와 쉼표가 포함되는 것에 유의해야 한다. 그 후 정수들을 뒤집거나 지우는 과정이 필요한데, 전체 배열을 뒤집는 연산을 효율적으로 처리하기 위해 deque 자료구조를 이용하면 된다.


풀이

#include <iostream>
#include <deque>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;

int main()
{
	int T, n;
	string p, str;

	cin >> T;

 테스트 케이스의 개수 T, 배열에 들어있는 수의 개수 n, 명령을 수행할 함수 문자열 p, 배열을 저장할 문자열 str를 초기화한다.

 

	while (T--)
	{
		cin >> p >> n >> str;

		deque<int> dq;
		string token;

		str.erase(remove(str.begin(), str.end(), '['), str.end());
		str.erase(remove(str.begin(), str.end(), ']'), str.end());

		stringstream s(str);

		while (getline(s, token, ','))
			dq.push_back(stoi(token));

 함수 p, 수의 개수 n, 배열 str를 입력받고, str에서 괄호 문자열을 지운다. 괄호를 제외하고 쉼표를 만날 때마다 덱에 정수를 삽입한다.

 

		bool is_reversed = false;
		bool is_error = false;

		for (auto& ch : p)
		{
			if (ch == 'R')
				is_reversed = !is_reversed;

			else if (ch == 'D')
			{
				if (dq.empty())
				{
					cout << "error\n";
					is_error = !is_error;
					break;
				}

				if (is_reversed)
					dq.pop_back();

				else
					dq.pop_front();
			}
		}

 그리고 뒤집어야 할지 판단하는 bool 변수 is_reversed와 에러가 발생했는지 판단하는 bool 변수 is_error를 초기화한다.

 함수 p를 순회하며 R 문자를 만난다면 is_reversed를 not 연산자! 를 이용해 바꿔주고, D 문자를 만났을 때 deque이 비었으면 에러를 출력하고 반복을 종료한다. 만약 deque이 비어있지 않고, 뒤집어야 한다면 정수를 뒤로 보내고, 아니면 앞으로 보낸다.

 

		if (!is_error)
		{
			cout << '[';

			while (!dq.empty())
			{
				if (is_reversed)
				{
					cout << dq.back();
					dq.pop_back();
				}

				else
				{
					cout << dq.front();
					dq.pop_front();
				}

				if (!dq.empty())
					cout << ',';
			}

			cout << "]\n";
		}
	}
}

 에러가 발생하지 않았을 때, 뒤집어져 있다면 뒤에서부터 출력하고, 뒤집어지지 않았다면 앞에서부터 출력하면 된다.

 

총합본

#include <iostream>
#include <deque>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;

int main()
{
	int T, n;
	string p, str;

	cin >> T;

	while (T--)
	{
		cin >> p >> n >> str;

		deque<int> dq;
		string token;

		str.erase(remove(str.begin(), str.end(), '['), str.end());
		str.erase(remove(str.begin(), str.end(), ']'), str.end());

		stringstream s(str);

		while (getline(s, token, ','))
			dq.push_back(stoi(token));

		bool is_reversed = false;
		bool is_error = false;

		for (auto& ch : p)
		{
			if (ch == 'R')
				is_reversed = !is_reversed;

			else if (ch == 'D')
			{
				if (dq.empty())
				{
					cout << "error\n";
					is_error = !is_error;
					break;
				}

				if (is_reversed)
					dq.pop_back();

				else
					dq.pop_front();
			}
		}

		if (!is_error)
		{
			cout << '[';

			while (!dq.empty())
			{
				if (is_reversed)
				{
					cout << dq.back();
					dq.pop_back();
				}

				else
				{
					cout << dq.front();
					dq.pop_front();
				}

				if (!dq.empty())
					cout << ',';
			}

			cout << "]\n";
		}
	}
}
반응형