백준 5430 AC / C++

이유참치·2025년 12월 15일

백준

목록 보기
104/248

문제 : 5430

풀이 point

[1,2,3,4] 입력 처리만 해결 되면 굉장히 쉬운 문제이다.
R이 들어오면 거꾸로 처리를 해줘야하는데 실제 값을 거꾸로 고치면 시간 초과가 일어난다.
그렇기 때문에 덱을 써서 revese가 true일때와 아닐때를 구분 지어 다른 행동을 취해주면 된다.

풀이 방법

숫자일 때만 값을 넣어야 하기 때문에 isdigit을 활용하여 숫자인지 파악하고 숫자이면 tmp에 더해준다.(두자리 or 세자리 수가 있을 수 있기 때문) 숫자가 아니면 값을 덱에 넣어주고 tmp를 초기화 해준다.

그 외는 설명한 것처럼 해주면 된다.

코드

//백준 5430, AC

#include <iostream>
#include <deque>

int main (){

    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL);
    std::cout.tie(NULL);

    int T, n;
    std::cin >> T;
    std::string s, nums;
    while(T--){
        std::cin >> s;
        std::cin >> n;
        std::cin >> nums;
        std::string tmp= "";
        std::deque<int> d;
        bool flag = false; bool error = false;
        for(int i{0}; i<nums.length(); ++i){
            if(isdigit(nums[i])) tmp+=nums[i];
            else{
                if(!tmp.empty()){
                    d.push_back(std::stoi(tmp));
                    tmp = "";
                }
            }
        }
        for(int i{0}; i<s.length(); ++i){
            if(s[i] == 'R'){
                if(flag) flag = false;
                else flag = true;
            }
            else{
                if(d.empty()){
                    std::cout << "error";
                    error = true;
                    break;
                }
                else if(flag) d.pop_back();
                else d.pop_front();
            }
        }
        if(d.empty() && !error){
            std::cout << "[]";
        }
        else if(!d.empty()){
            if(flag){
                int len = d.size()-1;
                std::cout << '[' << d.back();
                d.pop_back();
                for(int i{0}; i<len; ++i){
                    std::cout << ',' << d.back();
                    d.pop_back();
                }
                std::cout << ']';
            }
            else{
                int len = d.size()-1;
                std::cout << '[' << d.front();
                d.pop_front();
                for(int i{0}; i<len; ++i){
                    std::cout << ',' << d.front();
                    d.pop_front();
                }
                std::cout << ']';
            }
        }
        std::cout << '\n';
    }

    return 0;
}
profile
임아리 - 대학생

0개의 댓글