[백준 5430] AC

silverCastle·2021년 12월 22일
0

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

✍️ 첫번째 접근

각 테스트케이스마다 수행할 함수, 배열에 들어있는 수의 개수, 배열에 들어있는 수를 입력받는다. 필자는 배열에 들어있는 수를 string 형태로 입력받았는데 이 string은 무조건 첫번째가 '['이고 마지막이 ']'이므로 이를 erase 함수를 통해 없애주었다. 그 후, ","을 기준으로 잘라진 토큰들을 저장한다. 시간초과를 피하기 위해 reverse 함수를 쓰는 것이 아닌 'R'이 짝수인지 홀수인지를 판단하여 마치 reverse 함수를 사용한 것처럼 동작하게 하였다. 'D'를 하였는데 아무 토큰도 저장되어 있지 않다면 "error"를 출력한다.
이를 실행하였더니, 틀렸다는 결과가 나와서 생각할 수 있는 모든 반례를 테스트해봤음에도 불구하고 계속 틀렸다고 하였다.
그래서 찬찬히 처음부터 살펴보았는데 만약 배열에 들어있는 수 즉, arrStr이 "[]"였다고 생각했을 때 이 배열의 앞과 뒤에 있는 괄호를 제거하게 되면 size가 0이 되는데 char temp[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;
}

✍️ 두번째 접근

그래서 배열에 들어있는 수를 입력받았을 때, "[]"처럼 입력받았을 경우와 그렇지 않을 경우를 나눠서 해결하였다.

#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;
}

0개의 댓글