알고리즘/BOJ
백준 5430번: AC (C++)
DOWN
2021. 6. 26. 13:53
문제 : https://www.acmicpc.net/problem/5430
5430번: AC
각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.
www.acmicpc.net
문제는 굉장히 쉽다. 굉장히 쉬운 문제지만 굉장히 귀찮고 짜증나는 문제다.
이 문제의 핵심은 첫번째는 reverse order에서 소비되는 시간을 줄이기 위해 디큐(데크)를 사용하는것과
[1,2,3] 처럼 괴상하게 input으로 들어오는값을 잘 처리하는 것이다.
처음에는 input의 각 숫자를 stoi 함수를 이용해서 처리하니까 시간초과가 나서 char타입을 처리해서 int 타입으로 바꿔주는 방법을 사용했다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <unordered_map>
#include <deque>
#include <string>
typedef long long ll;
using namespace std;
deque<int> dq;
int main(int argc, char** argv)
{
cin.tie(NULL);
ios_base::sync_with_stdio(false);
int tn;
cin >> tn;
while(tn--){
string func;
int n;
string l;
dq.clear();
bool reverse = false;
cin >> func;
cin >> n;
cin >> l;
int idx = 0;
while(idx < l.length()){
if(l[idx] == ',' || l[idx] == '[' || l[idx] == ']'){
idx++;
continue;
}
int num = 0;
while(l[idx] >= '0' && l[idx] <= '9'){
num = 10*num;
num += l[idx] - '0';
idx++;
}
dq.push_back(num);
}
int err = 0;
for(char c : func){
if(c=='R'){
reverse = !reverse;
}
else{
if(dq.empty()){
cout << "error\n";
err = 1;
break;
}
if(!reverse){
dq.pop_front();
}
else{
dq.pop_back();
}
}
}
if(err==1) continue;
cout << '[';
while (!dq.empty()) {
if (!reverse) {
cout << dq.front();
dq.pop_front();
}
else {
cout << dq.back();
dq.pop_back();
}
if (!dq.empty()) {
cout << ",";
}
}
cout << "]\n";
}
}