Algorithm/백준

[백준][C++] 5430번: AC <223>

샤아이인 2022. 5. 26.

직접 풀어보고 올리는 코드입니다. 지적이나 더 좋은 방향에 대한 댓글은 항상 환영합니다.

 

 

5430번: AC

각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.

www.acmicpc.net

생각의 흐름

우선 각 케이스마다 별도로 bool값을 담아두는 isReverse 와 isError 변수를 만드는 것이 핵심이다.

 

1) isReverse 의 사용처

이 문제를 읽자마자 든 생각은, "이걸 직접 진짜 배열을 뒤집으면 시간안에 못풀겠는데?" 였다.

당연히 직접 뒤집을 필요도 없는 문제이다.

 

isReverse 에 true가 담겨있으면 -> 뒤집혔다 생각하고 deque의 맨 뒤에서 원소를 제거하면 되고,

isReverse 에 false가 담겨있으면 -> 정상이다 생각하고 deque의 맨 앞에서 원소를 제거하면 된다.

 

2) isError의 사용처

입력을 deque에 삽입한 후, 원소를 제거하면서 나가다 만약 D 연산이 사용되야 하는데 deque이 비어있다면 이때는 "Error"을 출력하고 끝나야 한다.

 

아니라면 정상적으로 원소를 제거한후 남아있는 deque을 출력하면 된다.

 

위 2개의 상황을 구분하는 것 이 isError이다.

isError 가 true 라면 "error"만 출력하고 끝나버리고

isError 가 false 라면 "[" 와 "]" 를 출력하는 코드가 추가된다.

 

2. 나의 코드

#include <bits/stdc++.h>
using namespace std;
#define MAX 101

int T;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin >> T;
    for(int i = 0; i < T; i++) {
        bool isReverse = false;
        bool isError = false;
        deque<string> dq;

        string func;
        cin >> func;

        int len;
        cin >> len;

        string numArr;
        cin >> numArr;

        string str = "";
        for(int j = 0; j < numArr.size(); j++) {
            if(isdigit(numArr[j])) {
                str += numArr[j];
            }else{
                if(!str.empty()) {
                    dq.push_back(str);
                    str = "";
                }
            }
        }

        for(auto o : func) {
            if(o == 'R') {
                isReverse = (isReverse == true) ? false : true;
            }else{
                if(dq.empty()) {
                    cout << "error" << '\n';
                    isError = true;
                    break;
                }
                if(isReverse){
                    dq.pop_back();
                }else{
                    dq.pop_front();
                }
            }
        }

        if(!isError) {
            cout << "[";
        }

        if(isReverse && !dq.empty()) {
            for(auto e = dq.rbegin(); e != dq.rend(); e++){
                if(e == dq.rend() - 1) {
                    cout << *e;
                }else {
                    cout << *e << ",";
                }
            }
        }

        if(!isReverse && !dq.empty()) {
            for(auto e = dq.begin(); e != dq.end(); e++){
                if(e == dq.end() - 1) {
                    cout << *e;
                }else {
                    cout << *e << ",";
                }
            }
        }

        if(!isError) {
            cout << "]\n";
        }

    }

    return 0;
}

 

댓글