1 minute read

코드

#include <bits/stdc++.h>
#define ll long long
using namespace std;
#define X first
#define Y second

/**
 * 함수 printResult: 결과 출력 함수
 * @param cr 뒤집는 연산 횟수
 * @param dq 덱
 */
void printResult(int cr, deque<int>& dq)
{
    if (cr & 1) // 뒤집는 연산 횟수가 홀수인 경우
    {
        cout << '[';
        int dsize = dq.size();
        for (int i = 0; i < dsize; i++)
        {
            cout << dq.back();
            dq.pop_back();
            if (i != dsize - 1)
                cout << ",";
        }
        cout << "]\n";
    }
    else // 뒤집는 연산 횟수가 짝수인 경우
    {
        cout << '[';
        int dsize = dq.size();
        for (int i = 0; i < dsize; i++)
        {
            cout << dq.front();
            dq.pop_front();
            if (i != dsize - 1)
                cout << ",";
        }
        cout << "]\n";
    }
}

int main(void) {
    ios::sync_with_stdio(false); // 입력과 출력을 빠르게 하기 위한 설정
    cin.tie(NULL); // cin과 cout의 동기화 제거

    int t; cin >> t; // 테스트 케이스의 개수 입력
    while (t--)
    {
        string command; cin >> command; // 동작 명령어 입력
        int n; cin >> n; // 배열의 크기 입력
        string s; cin >> s; // 배열 요소를 문자열로 입력
        int len = s.length();
        string tmp;
        deque<int> dq;
        for (int i = 0; i < len; i++)
        {
            if (!isdigit(s[i])) // 숫자가 아닌 경우
            {
                if (!tmp.empty())
                {
                    dq.push_back(stoi(tmp)); // 임시 문자열을 숫자로 변환하여 덱에 넣음
                    tmp.clear(); // 임시 문자열을 비움
                }
            }
            else // 숫자인 경우
            {
                tmp += s[i]; // 임시 문자열에 숫자를 추가
            }
        }
        int cr = 0; // 뒤집는 연산 횟수
        bool flag = 0; // error 체크
        int clen = command.length();
        for (int i = 0; i < clen; i++)
        {
            if (command[i] == 'R') // R 명령어인 경우
            {
                cr++; // 뒤집는 연산 횟수 증가
            }
            else // D 명령어인 경우
            {
                if (dq.empty()) // 덱이 비어있는 경우 오류
                {
                    flag = 1; // error 플래그를 세움
                    break;
                }
                if (cr & 1) // 뒤집는 연산 횟수가 홀수인 경우
                {
                    dq.pop_back(); // 덱의 마지막 요소 제거
                }
                else // 뒤집는 연산 횟수가 짝수인 경우
                {
                    dq.pop_front(); // 덱의 첫 번째 요소 제거
                }
            }
        }
        if (flag == 1)
        {
            cout << "error\n"; // error가 발생한 경우 "error" 출력
            continue;
        }
           
        printResult(cr, dq); // 결과 출력
    }
    return 0;
}

문자열 파싱처리가 중요한 덱 활용 문제였습니다.
골드5치고는 쉬운 문제라고 생각이 드네요.

Leave a comment