[伯俊5430]交流


https://www.acmicpc.net/problem/5430
▼▼初めて近づく
各テストケースは、実行する関数、配列内の個数、配列内の個数を入力します.筆者は配列中の数字を文字列形式で入力し,この文字列は無条件に最初が[],最後が[],erase関数で消去した.そして、「,」を基準として切り出されたタグが格納される.タイムアウトを避けるためではなく、「R」が偶数か奇数かを判断し、逆関数を使ったように動作させる.D'を作成したがトークンが保存されていない場合は「error」を出力します.
実行後,結果は誤りであり,考えられるすべての反例をテストしたにもかかわらず,誤りを続けた.
そこで最初からよく見てみると、配列中の数字ArrStrが「[]」だと思うと、その配列の前後の括弧を外すとsizeは0、chartemp[arrStr.size()];このchar temp[0];これは間違いを意味するからです.
#include <bits/stdc++.h>
using namespace std;
int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);

    int T = 0;
    cin >> T;
    while(T--) {
        // 수행할 함수, 배열에 들어있는 수의 개수, 배열에 들어있는 수를 입력받는다.
        string str = "";
        cin >> str;
        int n = 0;
        cin >> n;
        string arrStr = "";
        cin >> arrStr;

        // 배열 앞, 뒤의 괄호 제거
        arrStr.erase(arrStr.begin());
        arrStr.erase(arrStr.end()-1);

        // strtok는 string으로 선언된 변수를 사용할 수 없으므로 char 배열에 복사한다.
        char temp[arrStr.size()];
        fill(temp,temp+arrStr.size(),0);
        for(int i = 0; i < arrStr.size(); i++) {
            temp[i] = arrStr[i];
        }
        
        // temp 배열에 있는 문자열을 콤마 단위로 잘라서 저장
        char* ptr = strtok(temp,",");
        deque<int> D;
        while(ptr != NULL) {
            D.push_back(atoi(ptr));
            ptr = strtok(NULL,",");
        }

        // 수행할 함수가 들어있는 문자열에서 각각의 문자에 대해 처리
        int flag = 0;   // error인지 판별하기 위한 변수
        int rev = 0;    // reverse함수를 쓰지 않기 위해
        for(int i = 0; i < str.length(); i++) {
            switch(str[i]) {
                case 'R':
                        ++rev;                        
                        break;
                case 'D':
                        if(D.empty()) {
                            cout << "error" << '\n';
                            flag = 1;
                        }
                        else {
                            if(rev % 2 == 0) {
                                D.pop_front();
                            }
                            else {
                                D.pop_back();
                            }
                        }
                        break;
            }
            if(flag)
                break;
        }
        
        // error가 아닐 경우에 출력
        if((!flag)) {
            cout << "[";
            if(rev % 2 == 0) {
                for(int i = 0; i < D.size(); i++) {
                    cout << D[i];
                    if(i != D.size()-1)
                        cout << ",";
                }
            }
            else {
                for(int i = D.size() - 1; i >= 0; i--) {
                    cout << D[i];
                    if(i != 0)
                        cout << ",";
                }
            }
            cout << "]" << '\n';
        }
    }

    return 0;
}
▼2度目の接近
したがって,配列内の数字を受信すると,[]と[]の2つのケースに分けて解決する.
#include <bits/stdc++.h>
using namespace std;
int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);

    int T = 0;
    cin >> T;
    while(T--) {
        // 수행할 함수, 배열에 들어있는 수의 개수, 배열에 들어있는 수를 입력받는다.
        string str = "";
        cin >> str;
        int n = 0;
        cin >> n;
        string arrStr = "";
        cin >> arrStr;

        // 배열 앞, 뒤의 괄호 제거
        arrStr.erase(arrStr.begin());
        arrStr.erase(arrStr.end()-1);

        deque<int> D;
        // strtok는 string으로 선언된 변수를 사용할 수 없으므로 char 배열에 복사한다.
        if(arrStr.size() != 0) {    // arrStr의 size가 0일 경우에 temp 배열의 size가 0으로 선언한다는 의미이므로 arrStr의 size가 0일 때와 아닐 때를 구분
            char temp[arrStr.size()];
            fill(temp,temp+arrStr.size(),0);
            for(int i = 0; i < arrStr.size(); i++) {
                temp[i] = arrStr[i];
            }
            // temp 배열에 있는 문자열을 콤마 단위로 잘라서 저장
            char* ptr = strtok(temp,",");
            while(ptr != NULL) {
                D.push_back(atoi(ptr));
                ptr = strtok(NULL,",");
            }
        }

        // 수행할 함수가 들어있는 문자열에서 각각의 문자에 대해 처리
        int flag = 0;   // error인지 판별하기 위한 변수
        int rev = 0;    // reverse함수를 쓰지 않기 위해
        for(int i = 0; i < str.length(); i++) {
            switch(str[i]) {
                case 'R':
                        ++rev;                        
                        break;
                case 'D':
                        if(D.empty()) {
                            cout << "error" << '\n';
                            flag = 1;
                        }
                        else {
                            if(rev % 2 == 0) {
                                D.pop_front();
                            }
                            else {
                                D.pop_back();
                            }
                        }
                        break;
            }
            if(flag)
                break;
        }
        
        // error가 아닐 경우에 출력
        if((!flag)) {
            cout << "[";
            if(rev % 2 == 0) {
                for(int i = 0; i < D.size(); i++) {
                    cout << D[i];
                    if(i != D.size()-1)
                        cout << ",";
                }
            }
            else {
                for(int i = D.size() - 1; i >= 0; i--) {
                    cout << D[i];
                    if(i != 0)
                        cout << ",";
                }
            }
            cout << "]" << '\n';
        }
    }

    return 0;
}