https://www.acmicpc.net/problem/5430
⊙ 문제
테스트케이스 개수 T에 대해
각 테스트케이스마다 수행할 함수 p, 배열에 들어있는 수의 개수 n, [x1,...,xn] 과 같은 형태로 배열에 들어있는 정수가 주어진다.
각 테스트 케이스에 대해서, 정수배열에 대해 함수를 수행한 결과를 출력하고, 빈 배열에 대해서 D를 수행할 경우 error를 출력한다.
이때, 정수배열에 대해 함수를 수행한 결과는 다음 규칙을 따른다.
함수 p는 'D'와 'R' 문자의 혼합 문자열이다.
D에 대해서는 정수 배열의 맨 왼쪽 원소를 삭제하고, R에 대해서는 정수 배열을 reverse 시킨다. (예 : 1,2,3,4 -> 4,3,2,1 )
⊙ 문제 접근 과정
첫 시도
deque를 사용하지 않고, 그냥 풀었다. 그랬더니 시간초과가 났다.
기존에 짠 코드에서는 시간초과를 풀 방법이 없는 것 같아
인터넷에 다른 답안을 참조했다.
두번째 시도
isdigit() 함수를 사용하여 숫자 부분만을 deque 자료형에 넘겨준다. -> 기존 코드보다 훨씬 간단한 코드로 정수배열의 정수만을 골라낼 수 있다.
R이면 boolean형의 reverse 변수를 바꾼다. 그리하여 deque 자료형의 값들을 reverse 직접 하지 않고, pop_back() , pop_front() 함수를 사용해 함수를 수행한다.
출력은 rbegin(), rend() 를 활용하여 간단하게 코드를 짠다.
⊙ 문제 풀이
//첫번째 시도
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <deque>
using namespace std;
void toVector(deque<int>& vec, string& arraystring)
{
size_t indexStart = 1;
size_t indexEnd;
while (1)
{
size_t indexEnd = arraystring.find(',',indexStart);
if (indexEnd == string::npos)
break;
int num = stoi(arraystring.substr(indexStart, indexEnd - indexStart + 1));
vec.push_back(num);
indexStart = indexEnd + 1;
}
indexEnd = arraystring.find(']');
int num = stoi(arraystring.substr(indexStart, indexEnd - indexStart));
vec.push_back(num);
/*for (int i = 0; i < vec.size(); i++)
cout << vec[i] << " ";*/
}
void doFunction(deque<int>& vec, string& function)
{
bool bo = false;
for (int i = 0; i < function.length(); i++)
{
char c = function[i];
if (c == 'R')
reverse(vec.begin(), vec.begin() + vec.size());
else if (c == 'D' && vec.size() != 0) {
vec.pop_front();
}
else
{
bo = true;
break;
}
}
if (!bo)
{
string re = "[";
for (int i = 0; i < vec.size(); i++)
{
re += to_string(vec[i]);
if (i != vec.size() - 1)
re += ",";
else //마지막 원소
{
re += "]\n";
}
}
if (vec.size() == 0)
re += "]\n";
cout << re;
}
else
{
cout << "error\n";
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int T;
cin >> T;
while (T--)
{
string function;
cin >> function;
int n; //배열에 들어있는 수의 개수 n
cin >> n;
string arraystring;
cin >> arraystring;
if (n != 0)
{
deque<int> vec;
toVector(vec, arraystring);
doFunction(vec, function);
}
else
cout << "error\n";
}
return 0;
}
//두 번째 시도
#include <iostream>
#include <deque>
#include <string>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, t;
cin >> t;
while (t--)
{
string order, str;
bool reverse = false, error = false;
deque<int> dq;
cin >> order;
cin >> n;
cin >> str;
string s = "";
for (int i = 0; i < str.length(); i++) {
if (isdigit(str[i])) {
s += str[i];
}
else
{
if (!s.empty()) {
dq.push_back(stoi(s));
s = "";
}
}
}
for (auto o : order) {
if (o == 'R') {
if (reverse)
reverse = false;
else
reverse = true;
}
else
{
if (dq.empty()) {
cout << "error\n";
error = true;
break;
}
if (reverse)
dq.pop_back();
else
dq.pop_front();
}
}
//error 아닌 경우 출력
if (!error) {
cout << "[";
}
if (reverse && !dq.empty()) {
for (auto o = dq.rbegin(); o != dq.rend(); o++)
{
if (o == dq.rend() - 1)
cout << *o;
else
cout << *o << ",";
}
}
else if (!reverse && !dq.empty()) {
for (auto o = dq.begin(); o != dq.end(); o++)
{
if (o == dq.end() - 1)
cout << *o;
else
cout << *o << ",";
}
}
if (!error)
cout << "]\n";
}
return 0;
}
⊙ 결과
'전공 > 알고리즘(algorithm)' 카테고리의 다른 글
[C++/BOJ] 10816 : 숫자카드2 - unordered_map, upperbound, lowerbound (0) | 2024.02.02 |
---|---|
[c++/자료구조] 정리: 우선순위 큐와 힙 (priority queue & heap) (0) | 2024.01.29 |
[C++] 자료구조 : 덱 정리 + (BOJ) 10866_덱 (0) | 2024.01.17 |
[C++] 백준(BOJ) 1966 프린터 (0) | 2024.01.12 |
[C++] 백준(BOJ) 1158 요세푸스 문제 (0) | 2024.01.12 |