문제
https://www.acmicpc.net/problem/5430
문제 요약
AC 언어는 정수 배열에 연산을 하기 위해 만든 언어이다.
함수 R은 수의 순서를 뒤집는 함수이고, D는 첫 번째 수를 버리는 함수이다.
배열이 비어있는 상태에서 D 함수를 사용하면, 에러가 발생한다.
배열의 초기값과 수행할 함수가 주어졌을 때, 최종 결과를 출력한다.
코드
#include <iostream>
#include <string>
#include <deque>
using namespace std;
int t;
int main() {
cin >> t;
while (t--) {
string p;
cin >> p;
int n;
cin >> n;
deque<int> dq;
string arr;
cin >> arr;
// 빈 배열일 때 예외 처리
if (arr == "[]") {
if (p.find('D') != string::npos) {
cout << "error\n";
}
else {
cout << "[]\n";
}
continue;
}
string num = "";
for (char ch : arr) {
if (isdigit(ch)) {
num.push_back(ch);
}
else if (ch == ',' || ch == ']') {
if (!num.empty()) {
dq.push_back(stoi(num));
num = "";
}
}
}
bool reverse = false;
bool is_error = false;
for (char command : p) {
if (command == 'R') {
reverse = !reverse;
}
else if (command == 'D') {
if (dq.empty()) {
is_error = true;
break;
}
if (reverse) {
dq.pop_back();
}
else {
dq.pop_front();
}
}
}
if (is_error) {
cout << "error\n";
}
else {
cout << "[";
while (!dq.empty()) {
if (reverse) {
cout << dq.back();
dq.pop_back();
}
else {
cout << dq.front();
dq.pop_front();
}
if (!dq.empty()) {
cout << ",";
}
}
cout << "]\n";
}
}
}
// R: 배열 수의 순서
// D: 첫 번째 수 버리기
코드 설명
1. 테스트 케이스 개수 t를 입력 받고, 그만큼 반복한다.
2. 수행할 함수 p와 처리할 정수 배열 arr를 문자열로 입력 받는다.
3. arr가 빈 배열일 경우를 예외 처리한다.
4. arr에서 정수를 추출하여 Deque 자료형 변수 dq에 차례로 삽입한다.
5 - 1. p에서 함수를 하나씩 꺼내서 작업을 수행한다.
5 - 2. 이 때, R 함수의 경우에는 bool형 변수 reverse를 두어 상태만 체크한다.
5 - 3. D 함수를 수행할 때는 reverse 변수를 체크하여 true면 뒤에서, false면 앞에서 정수를 삭제한다.
5 - 4. dq가 비었는데, D 함수를 수행하려할 경우에는 bool형 변수 is_error를 사용하여 체크한다.
6. dq와 is_error를 체크하여 결과를 출력한다.
고찰
초기에 Deque를 사용하지 않고, Queue와 Stack으로만 문제를 풀려고 하니, 시간 초과가 발생했다.
'Algorithm Problems > 자료구조' 카테고리의 다른 글
[백준/C++] 9935번 문자열 폭발 (0) | 2024.12.31 |
---|---|
[백준/C++] 7662번: 이중 우선순위 큐 (0) | 2024.12.15 |
[백준/C++] 2493번: 탑 (1) | 2024.08.13 |
[백준/C++] 2357번: 최솟값과 최댓값 (0) | 2024.08.01 |
[백준/C++] 25603번: 짱해커 이동식 (1) | 2024.07.25 |