Baekjoon Review

[Gold 5] 5430번 AC

hanseongbugi 2023. 11. 3. 15:56

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

 

5430번: AC

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

www.acmicpc.net

 

이 문제는 deque를 이용해서 해결해야 한다.

 

R 연산의 경우 deque의 특성인 앞뒤 빼기가 가능하다는 점을 통해 

boolean 타입의 변수를 통해 reverse 상태면 D연산 시 뒤를 빼도록 하고

reverse상태가 아니면 D 연산 시 앞을 빼도록 한다.

 

입력 배열의 형태가 [1,2,3] 과 같은 형태이므로 이 값을 deque에 삽입하기 위해  숫자를 빼내야한다.

이를 위해 문자열의 길이만큼 배열을 순회하고 현재 문자열의 요소가 숫자인 경우 민 문자열에 현재 요소를 합친다.

이후 숫자가 아닌 값인 ','이나 ']'을 만나는 경우 deque에 값을 삽입한다.

 

출력 시 reverse 상태인 경우 뒤에서 부터 출력하고, reverse 상태가 아니면 앞에서 부터 출력한다. 

 

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

int len;
string x;
bool error = false;
bool rever = false;

deque<int> makeArray() {
	deque<int> arr;
	string s = "";
	for (int i = 0; i < x.length(); i++) {
		if (isdigit(x[i])) {
			s += x[i];
		}
		else {
			if (!s.empty()) {
				arr.push_back(stoi(s));
				s = "";
			}
		}
	}
	return arr;
}
void printArray(deque<int> arr) {

	cout << "[";
	if (!arr.empty()) {
		if (rever) {
			for (int i = arr.size() - 1; i > 0; i--) {
				cout << arr[i] << ",";
			}
			cout << arr[0];
		}
		else {
			for (int i = 0; i < arr.size() - 1; i++) {
				cout << arr[i] << ",";
			}
			cout << arr[arr.size() - 1];
		}
	}
	cout << "]"<<'\n';
}

void AC(deque<int>& arr, string p) {
	for (int i = 0; i < p.length(); i++) {
		if (p[i] == 'R') {
			if (rever) rever = false;
			else rever = true;

		}
		if (p[i] == 'D') {
			if (arr.empty()) {
				cout << "error" << '\n';
				error = true;
				return;
			}
			if (rever)
				arr.pop_back();
			else
				arr.pop_front();
		}
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int T;
	cin >> T;

	for (int i = 0; i < T; i++) {
		string p;
		cin >> p;

		cin >> len;
		cin >> x;

		deque<int> arr = makeArray();
		rever = false;
		error = false;
		AC(arr, p);

		if (!error)
			printArray(arr);

	}
}