선영이는 주말에 할 일이 없어서 새로운 언어 AC를 만들었다. AC는 정수 배열에 연산을 하기 위해 만든 언어이다. 이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다.
함수 R은 배열에 있는 숫자의 순서를 뒤집는 함수이고, D는 첫 번째 숫자를 버리는 함수이다. 배열이 비어있는데 D를 사용한 경우에는 에러가 발생한다.
함수는 조합해서 한 번에 사용할 수 있다. 예를 들어, "AB"는 A를 수행한 다음에 바로 이어서 B를 수행하는 함수이다. 예를 들어, "RDD"는 배열을 뒤집은 다음 처음 두 숫자를 버리는 함수이다.
배열의 초기값과 수행할 함수가 주어졌을 때, 최종 결과를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. T는 최대 100이다.
각 테스트 케이스의 첫째 줄에는 수행할 함수 p가 주어진다. p의 길이는 1보다 크거나 같고, 100,000보다 작거나 같다.
다음 줄에는 배열에 들어있는 수의 개수 n이 주어진다. (0 ≤ n ≤ 100,000)
다음 줄에는 [x1,...,xn]과 같은 형태로 배열에 들어있는 수가 주어진다. (1 ≤ xi ≤ 100)
전체 테스트 케이스에 주어지는 p의 길이의 합과 n의 합은 70만을 넘지 않는다.
우선 입력 사례가 배열 식으로 입력이 된다는점, 따라서 이를 string 객체로 받아서 deque에 입력 시켜야 하는데 이때 문제가 발생한다. 그것은 두 자리 수와 같은 경우 가령 [42,11] 과 같은 배열이 입력될 경우에 '['','']'을 제외한 부분을 덱에 입력 시킨다고 하면 42를 각각 한자리 수인 4와 2로 분할하여 입력할 것이므로 이를 해결 하기 위한 아이디어는 또다른 string 객체를 만들어서 ',' 혹은 ']' 을 만나기 전까지 0부터 9사이의 숫자를 스트링에 덧셈으로 연결 시킨 후에 ','나 ']'를 만난다면 그 값을 int형으로 변환 시켜 입력 시키는 것이다.
그렇다면 string객체를 int형으로 어떻게 입력 시킬 것인가 c++ 14이후부터는 stoi로 손쉽게 할수 있으나 기본적인 방법은 변환하고자 하는 string객체 가령 temp.c_str()로 변환시킨다.
이렇게 덱에 각 원소를 저장시킨 것 까지는 완수 하였는데 문제는 R과 D에대 한 처리이다 나는 처음에 R에대한 함수를 deque에서 제공하는 reverse함수를 사용하여 새로운 덱을 하나 생성하여 reverse된 덱을 임시저장후 swap하는 방식을 사용하였는데 이는 메모리를 차지하여 런타임을 발생시킨다.
그리고 덱을 사용해야만 하는 이유에 부합되지 않으므로 새로운 방법을 찾았는데 reverse라는 것이 결국 앞과 뒤의 양끝에서 부터 작업이 이루어지는 것이므로 만약 R이 들어와서 reverse가 되었다면 이를 표시할 bool 객체를 false값으로 두고 다시 reverse 된다면 다시 true로 변환하는 식으로 작업해주고 각 상황에 대해서 bool객체의 값이 참이냐 거짓이냐 에따라 참인 경우는 앞에서 부터의 삭제 거짓인 경우는 뒤에서 부터의 삭제를 해주고
출력할 때 또한 마찬가지로 현재 reverse가 거짓 값이라면 뒤에서부터 출력 참 값이라면 앞에서 부터 출력시켜 주면 새로운 덱의 생성이나 반복문을 낭비하지 않아도 된다.
따라서 리버스 된 후 삭제를 해주고 다시 리버스를 해서 출력을 하든 리버스 삭제 리버스 삭제 리버스 출력을 해주든간에 결국 덱을 완전히 역순으로 바꿔주고 삭제하고 출력하는 것과 같은 결과이므로 더 간단한 방법으로 해결 가능하다.
#include <iostream>
#include <deque>
#include <string>
using namespace std;
int main(void)
{
int N;
cin>>N;;
for(int i=0; i<N; i++)
{
string str,arr;
int siz;
deque de;
bool reverse=true;
cin >> str;
cin >> siz;
cin >> arr;
int count;
string temp;
for(int j=0; j<arr.length(); j++)
{
if('0'<=arr[j] && arr[j]<='9' )
{
temp += arr[j];
count = 1;
}
else if(arr[j]==',' && count ==1 ||arr[j]==']' && count == 1)
{
de.push_back(atoi(temp.c_str()));
temp.clear();
count =0;
}
}
bool check = true;
for(int j=0; j<str.size(); j++)
{
if(str[j]=='R')
{
reverse = !reverse;
}
else if(str[j]=='D')
{
if(!de.empty())
{
if(reverse)
{
de.pop_front();
}
else{
de.pop_back();
}
}
else if( de.empty()){
cout<<"error"<<endl;
check= false;
break;
}
}
}
if(check)
{
if(reverse)
{
cout<<"["<<de.front();
de.pop_front();
while(!de.empty())
{
cout<<","<<de.front();
de.pop_front();
}
cout<<"]"<<endl;
}
else
{
cout<<"["<<de.back();
de.pop_back();
while(!de.empty())
{
cout<<","<<de.back();
de.pop_back();
}
cout<<"]"<<endl;
}
}
}
}
'Algorithm' 카테고리의 다른 글
백준 1773번 폭죽쇼 (0) | 2019.07.19 |
---|---|
백준 10822 더하기 (0) | 2019.07.18 |
백준 1966 프린터 큐 (0) | 2019.07.17 |
백준 9012 괄호 (0) | 2019.07.16 |
백준 1753 최단경로 (메모리초과) (0) | 2019.07.14 |