본문으로 바로가기

백준 05430 - AC

category BOJ 백준/기타 2020. 11. 5. 20:16

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

 

5430번: AC

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

www.acmicpc.net

 

고려사항

- string으로 수 배열을 받아서 파싱하는 작업이 복잡! ( 79 - 89 라인)

- 빈배열([ ]) 이라면 파싱을 안거치기 위해 예외처리! ( 74 - 77 라인)

- 처음에는 덱을 활용하여, R이 나타나면  불리언 flag를 설정하여 pop_front, pop_back 할 지를 결정할라 했지만

www.acmicpc.net/board/view/25456 를 참조하여 직접 큐를 구현했을 때처럼 front, back 인덱스를 관리해주기로 결정.

 

글 읽기 - ★☆★☆★ [필독] AC FAQ ★☆★☆★

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 

- front 는 pop() 할 자리, back 은 push() 할 자리.

- 'R' 일시에 17 - 27 라인 처럼 인덱스 관리. 윗줄의 규칙을 지킨다고 생각!

단, back 인덱스가 -1 이 될 수도 있지만, 5430 문제에서는 더이상의 push는 없기 때문에 신경쓰지 않아도 된다.

- front == back 이면 비어있는 상태 => 'D' 일시에 error 출력.

- front < back 이면 정상 순서 => front ~ back 증가하면서 출력

- front > back 이면 R로 인해 뒤집은 상태 => front ~ back 감소하면서 출력

 

#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <stdlib.h>
using namespace std;

void print(string str, vector<int> &v){
    int funcLen = str.length();
    int front = 0;
    int back = v.size();
    int tmp;
    char c;

    for(int j=0;j<funcLen;++j){
        c = str[j];
        if(c == 'R'){
            if(front < back){
                tmp = back;
                back = front-1;
                front = tmp-1;
            }else if( front > back){
                tmp = back;
                back = front+1;
                front = tmp+1;
            }
        }else{
            if(front == back){
                cout<<"error\n";
                return ;
            }else{
                if(front < back){
                    ++front;
                }else if(front > back){
                    --front;
                }
            }
        }
    }

    cout<<"[";
    if(front < back){
        for(int i=front;i<back;++i){
            if(i == front){
                cout<<v[i];
            }else{
                cout<<","<<v[i];
            }
        }
    }else if(front > back){
        for(int i=front;i>back;--i){
            if(i == front){
                cout<<v[i];
            }else{
                cout<<","<<v[i];
            }
        }
    }
    cout<<"]\n";
}

int main() {
    cin.tie(NULL);
    ios::sync_with_stdio(false);

    int t, n, cur, prev;
    string func, arr;

    cin>>t;
    for(int i=0;i<t;++i){
        cin>>func>>n>>arr;

        vector<int> v;
        if(n == 0){
            print(func, v);
            continue;
        }

        arr.erase(arr.begin());
        arr.erase(arr.end()-1);
        prev = 0; cur = arr.find(',');

        while(cur != -1){
            string str = arr.substr(prev,cur-prev);
            v.push_back(stoi(str));
            prev = cur+1;
            cur = arr.find(',', prev);
        }
        v.push_back(stoi(arr.substr(prev,cur-prev)));
        
        print(func, v);
    }
    return 0;
}