본문 바로가기

알고리즘 공부 및 문제 풀이/백준(BOJ)

[boj] 백준 5430 AC (c++) - deque

[문제]

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

 

5430번: AC

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

www.acmicpc.net

 

[풀이]

deque을 이용.

reverse boolean 값을 선언해두고 배열이 뒤집어진 상태인지를 반영한 후, 'D'에 대해 뒤집어진 상태이면 deq.pop_back() 함수를, 뒤집어지지 않은 상태이면 deq.pop_front() 함수를 사용한다.

마찬가지로 출력 시에도 배열이 뒤집어진지 확인한 후 deque의 앞 혹은 뒤에서부터 출력해준다.

 

[코드]

 

#include <iostream>
#include <algorithm>
#include <string>
#include <queue>

using namespace std;

int t;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> t;

    string fun, arr;
    for(int i=0; i<t; i++){
        cin >> fun; //RD 함수
        int len;
        cin >> len; //숫자 개수
        cin >> arr; //배열

        deque<int> deq;

        string s = "";
        for(int j=0; j<arr.length(); j++){
            if(isdigit(arr[j])){
                s += arr[j];
            }
            else{
                if (!s.empty()){
                    deq.push_back(stoi(s));
                    s.clear();
                }
            }
        }

        bool error = false, reverse = false;
        for (auto f : fun){
            if(f=='R'){
                if(reverse)
                    reverse = false;
                else reverse = true;
            }
            else{
                if(deq.empty()){
                    cout << "error\n";
                    error = true;
                    break;
                }
                if(reverse)
                    deq.pop_back();
                else
                    deq.pop_front();
            }
        }

        if(!error) {
            cout << "[";
            if (!deq.empty() && reverse){
                while(!deq.empty()){
                    cout << deq.back();
                    deq.pop_back();
                    if(!deq.empty())
                        cout << ",";
                }
            }
            if( !deq.empty() && !reverse){
                while(!deq.empty()){
                    cout << deq.front();
                    deq.pop_front();
                    if(!deq.empty())
                        cout << ",";
                }
            }
            cout << "]\n";
        }
    }
}