본문 바로가기

Algorithm Problems/자료구조

[백준/C++] 5430번: AC

문제

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


문제 요약

AC 언어는 정수 배열에 연산을 하기 위해 만든 언어이다.

 

함수 R은 수의 순서를 뒤집는 함수이고, D는 첫 번째 수를 버리는 함수이다.

 

배열이 비어있는 상태에서 D 함수를 사용하면, 에러가 발생한다.

 

배열의 초기값과 수행할 함수가 주어졌을 때, 최종 결과를 출력한다.


코드

#include <iostream>
#include <string>
#include <deque>

using namespace std;

int t;

int main() {
    cin >> t;

    while (t--) {
        string p;
        cin >> p;

        int n;
        cin >> n;

        deque<int> dq;

        string arr;
        cin >> arr;

        // 빈 배열일 때 예외 처리
        if (arr == "[]") {
            if (p.find('D') != string::npos) {
                cout << "error\n";
            }
            else {
                cout << "[]\n";
            }
            continue;
        }

        string num = "";

        for (char ch : arr) {
            if (isdigit(ch)) {
                num.push_back(ch);
            } 
            else if (ch == ',' || ch == ']') {
                if (!num.empty()) {
                    dq.push_back(stoi(num));
                    num = "";
                }
            }
        }

        bool reverse = false;
        bool is_error = false;

        for (char command : p) {
            if (command == 'R') {
                reverse = !reverse;
            }
            else if (command == 'D') {
                if (dq.empty()) {
                    is_error = true;
                    break;
                }
                if (reverse) {
                    dq.pop_back();
                }
                else {
                    dq.pop_front();
                }
            }
        }

        if (is_error) {
            cout << "error\n";
        }
        else {
            cout << "[";
            while (!dq.empty()) {
                if (reverse) {
                    cout << dq.back();
                    dq.pop_back();
                }
                else {
                    cout << dq.front();
                    dq.pop_front();
                }

                if (!dq.empty()) {
                    cout << ",";
                }
            }
            cout << "]\n";
        }
    }
}

// R: 배열 수의 순서
// D: 첫 번째 수 버리기

코드 설명

1. 테스트 케이스 개수 t를 입력 받고, 그만큼 반복한다.

 

2. 수행할 함수 p와 처리할 정수 배열 arr를 문자열로 입력 받는다.

 

3. arr가 빈 배열일 경우를 예외 처리한다.

 

4. arr에서 정수를 추출하여 Deque 자료형 변수 dq에 차례로 삽입한다.

 

5 - 1. p에서 함수를 하나씩 꺼내서 작업을 수행한다.

 

5 - 2. 이 때, R 함수의 경우에는 bool형 변수 reverse를 두어 상태만 체크한다.

 

5 - 3. D 함수를 수행할 때는 reverse 변수를 체크하여 true면 뒤에서, false면 앞에서 정수를 삭제한다.

 

5 - 4. dq가 비었는데, D 함수를 수행하려할 경우에는 bool형 변수 is_error를 사용하여 체크한다.

 

6.  dq와 is_error를 체크하여 결과를 출력한다.


고찰

초기에 Deque를 사용하지 않고, Queue와 Stack으로만 문제를 풀려고 하니, 시간 초과가 발생했다.