문제설명
입출력 예제
개념
정수 배열을 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";
}
}
}
반응형
'Algorithm > 백준' 카테고리의 다른 글
[백준] 11279 최대 힙 with C++ (0) | 2023.05.21 |
---|---|
[백준] 16139 인간-컴퓨터 상호작용 with C++ (0) | 2023.05.20 |
[백준] 1021 회전하는 큐 with C++ (0) | 2023.05.18 |
[백준] 10866 덱 with C++ (0) | 2023.05.17 |
[백준] 1966 프린터 큐 with C++ (0) | 2023.05.16 |