하루하루 꾸준히, 인생은 되는대로

자료구조

백준 5430 AC C++

긤효중 2022. 3. 3. 21:14

https://www.acmicpc.net/problem/5430

 

5430번: AC

각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.

www.acmicpc.net


문제

선영이는 주말에 할 일이 없어서 새로운 언어 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만을 넘지 않는다.


출력

각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.


R의 개수에 따라서 앞에서 뺴는지 뒤에서 뺴는지 달라진다

[1,2,3,4]의 경우에 RDD가 함수이면

 

R이 false인 상태에서 R이 왔으므로 R값을 True로 바꿔준다.

D가 2번오므로 뒤에서 덱을 2번 뺴내면 된다.

R값이 false이면 앞에서 덱을 빼내고 , R값이 true이면 뒤에서 덱을 뺴내면 된다.


전체 소스 코드->

#include<iostream>
#include<string>
#include<deque>
#include<cstring>
#include<cctype>
 
using namespace std;
 
int main(void){
    int t;
    cin >> t; //테스트 케이스의 개수
 
    for(int i = 0;i<t;i++){
        bool R = false; //R값이 들어오면 true, R값인 tre인 상태에서 다시 들어오면 false
        bool is_error = false;//error가 나면 true로 바뀜
     deque <int> dq; //덱 라이브러리
       
        string str;
        cin >> str; //수행할 함수 (ex.RDD) 입력받기
       
        int n;
        cin >> n; //배열의 개수 입력
       
        string arr; //[1,2,3,4,5...]와 같은 문자열 -> 문자열에서 숫자로 바꾸고 덱에 넣기
        cin >> arr;
       
        string temp; //임시 문자열
       
        for(int i = 0;i<arr.size();i++){ //arr의 길이만큼 돌면서
           
           
            if(isdigit(arr[i]) != 0 && arr[i+1] == ','){
                temp = temp + arr[i];
                int n = stoi(temp);
                dq.push_back(n);
                temp = "";
            }
           
            /*arr[i]가 숫자이고 arr[i+1](숫자의 다음 배열값)이 ','라면
            빈문자열에 arr[i]를 더해주고 string->int한 결과를 n에저장하고
            덱에 넣는다.
            임시 문자열 temp 초기화.
            */
            else if(isdigit(arr[i]) != 0 && isdigit(arr[i+1]) != 0){
                temp = temp + arr[i];
            }
            /*arr[i]가 숫자이고 arr[i+1]도 숫자이면 문자열을 더해나간다
            */
           
            else if(isdigit(arr[i])!= 0 && arr[i+1] == ']'){
                temp = temp + arr[i];
                int n = stoi(temp);
                dq.push_back(n);
                temp = "";
            }
            /*arr[i]가 숫자이고 arr[i+1]이 ']'라면
            temp를 더해주고 temp를 int로 바꾼 값을 덱에 넣어준다
            */

 
        }
 
        for(int i = 0;i<str.size();i++){//함수의 길이만큼 루프 돌리면서
             if(str[i] == 'R'){ //R이들어오면 false인경우 true로 true인 경우는 false로 바꿈
                if(R == false){
                    R = true;
                }
                else if(R == true){
                    R = false;
                }
 
            }
           else if(str[i] == 'D'){ //D일떄
                if(dq.empty()){ //덱이 비어있으면 error출력 후 is_error를 참으로 갱신
                    cout << "error";
                    is_error = true;
                    break;//바로 루프 탈출
                }
                else if(!dq.empty()){//덱이 비어있지 않다면
                    if(R == false){ //R이 fasle인 경우 앞의 원소 뺴내고
                        dq.pop_front();
                    }
                    else if(R == true){ //R이 true인경우 뒤의 원소 뺴내기
                        dq.pop_back();
                    }
                }
            }
 
        }
 
        if(is_error != true){ //error가 발생한 경우를 제외하고 '['출력
        cout << '[';
        }
 
 
        while(1){
            if(R == false){ //R이 거짓이면
                if(dq.empty()){
                    break;
                }
                cout << dq.front(); //앞에서 원소 뽑고
                if(!dq.empty()){ //앞의 원소 제거
 
 
                    dq.pop_front();
                    if(dq.size() != 0){ //덱의 사이즈가 0이 아니면 ,출력하기
                        cout << ',';
                    }
 
                }
 
 
            }
            else if(R == true){ //R이 참인경우
                 if(dq.empty()){ //뒤에서 원소 빼내고 뒤에서 원소 제거
                    break;
                }
                cout << dq.back();
                if(!dq.empty()){
 
                    dq.pop_back();
                    if(dq.size() != 0){ //덱의 사이즈가 0이 아니면, ㄹ출력하기
                        cout << ',';
                    }
                }
 
            }
        }
 
 
        if(is_error != true){ //error가 아니면 ']출력'
 
        cout << ']';
        }
 
        cout << '\n';
 

    }
 
}

 

'자료구조' 카테고리의 다른 글

백준 숫자 카드 2 C++  (0) 2022.03.09
C++ Map사용법 [STL] + 백준 듣보잡  (0) 2022.03.08
백준 오큰수(17298번) C언어  (0) 2022.02.22
백준 2493 C언어  (0) 2022.02.18
백준 17952 C언어  (0) 2021.10.07