https://www.acmicpc.net/problem/5430
선영이는 주말에 할 일이 없어서 새로운 언어 AC를 만들었다. AC는 정수 배열에 연산을 하기 위해 만든 언어이다. 이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다.
주말에 할 게 없다고 새로운 언어를 만들어 버린 선영이를 위해 초기값과 수행할 함수가 주어졌을 때 언어의 연산을 거친 최종 결과를 구하는 프로그램이다.
문제 설명
이 언어의 함수는 R, D가 있는데, R은 문자열을 뒤집는 함수, D는 문자열의 첫 번째 수를 버리는 함수이다.
문제의 포인트
수행할 함수의 수와 문자가 정말 상당히 길기 때문에, Deque를 이용해야한다는 아이디어를 떠올려야 한다.
또한 앞뒤를 따져 미리 문자를 버려놓고 후에 문자열을 뒤집는 작업을 하면 그때그때 문자열을 뒤집어 시간을 낭비하는 행위를 방지할 수 있다. 문자열을 뒤집는 횟수를 bool로 저장해 놓는 것도 포인트이다.
코드
#include<iostream>
#include<deque>
#include<algorithm>
#include<string>
using namespace std;
int t, n;
string strp, strn;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> t;
while (t--)
{
cin >> strp;
cin >> n;
cin >> strn;
deque<int> dq;
bool flag = true; //error
bool dir = true; //정방향 역방향
string temp = "";
for (int i = 1; i < strn.size(); i++) //string to deque
{
if (strn[i] == ',' || strn[i] == ']')
{
if (temp != "")
{
dq.push_back(stoi(temp));
temp = "";
}
}
else
{
temp += strn[i];
}
}
for (int i = 0; i < strp.size(); i++)
{
if (strp[i] == 'R')
{
dir = !dir;
}
else if (strp[i] == 'D')
{
if (dq.empty())
{
flag = false;
break;
}
else//출력
{
if (dir) dq.pop_front();
else dq.pop_back();
}
}
}
if (!flag) cout << "error\n";
else
{
if (!dir) reverse(dq.begin(), dq.end());
cout << "[";
for (int i = 0; i < dq.size(); i++)
{
if (i == dq.size() - 1)
cout << dq[i];
else
cout << dq[i] << ",";
}
cout << "]\n";
}
}
}
여담
이 문제도 전에 풀었던 것인데, 정리를 하려니 복습도 되고 좋다. 솔직히 미리 해놓았다면 어떨까 하는 생각도 든다..^^
'코딩테스트' 카테고리의 다른 글
백준 12015번 가장 긴 증가하는 부분 수열 2 C++풀이 (0) | 2022.12.01 |
---|---|
백준 1027번 게임 C++풀이 (0) | 2022.11.29 |
백준 10799번 쇠막대기 C++ 풀이 (0) | 2022.11.21 |
백준 1620번 나는야 포켓몬 마스터 이다솜 C++ 풀이 (0) | 2022.11.11 |
백준 2504 괄호의 값 C++ 풀이 (0) | 2022.11.09 |
댓글