FIXPAREN 질문입니다.

  • pushbell7
    pushbell7

    제가 무언가 놓치고 있는 것 같은데 무엇을 놓치고 있는지 모르겠습니다.

    • 각 케이스별로 객체를 만들어 입력으로 받은 두개의 스트링을 받아서 생성자에서 자료처리에 알맞게 초기화합니다.
    • 처리할 문자열을 하나씩 받아서 여는 괄호면 스택에 해당 인덱스를 넣습니다.
    • 닫는 괄호일 때 현재 처리중인 닫는 괄호와 스택 탑의 여는 괄호를 비교해 일치하면 옳바른 문자이므로 스택에서 팝합니다.
    • 두 괄호가 다르다면 mismatched 경우이므로 둘의 우선순위를 비교해 더 높은 우선순위를 갖는 괄호로 맞추어줍니다.

    • get_pair 함수는 닫는 괄호를 입력으로 받아 해당 여는 괄호를 리턴합니다.

    • get_higher_priority 함수는 여는 괄호를 입력으로 받아 우선순위를 비교하고 해당하는 닫는 괄호를 리턴합니다.

    소스코드입니다.

    #include <iostream>
    #include <vector>
    #include <stack>
    #include <queue>
    #include <cstring>
    using namespace std;
    
    #define MAX_LENGTH 128
    #define COUNT_OF_PARENTHESE 4
    
    class God_sohyun{
        char priority[COUNT_OF_PARENTHESE];
        stack<int> s_storage;
        queue<char> input;
        vector<char> v_result;
    public:
        God_sohyun(char _input[MAX_LENGTH], char _priority[COUNT_OF_PARENTHESE] ) {
            string str(_input);
            for(int i=0; i<str.size(); i++)
                input.push(str[i]);
            for(int i=0; i<COUNT_OF_PARENTHESE; i++)
                priority[i] = _priority[i];
        }
        char get_pair(char c){
            switch(c){
            case ')':
                return '(';
            case '}':
                return '{';
            case ']':
                return '[';
            case '>':
                return '<';
            }
            return -1;
        }
        //왼쪽 괄호만 넘겨야함
        //리턴은 오른쪽 괄호로 넘겨서 get_pair를 쓸 수 있도록 취함
        char get_higher_priority(char left, char right){
            char ch;
            for(int i=0; i<COUNT_OF_PARENTHESE; i++){
                if(priority[i] == left || priority[i] == right ){
                    ch = priority[i]; break;
                }
            }
            switch(ch){
            case '(':
                return ')';
            case '{':
                return '}';
            case '[':
                return ']';
            case '<':
                return '>';
            }
        }
        void run(){
            char ch;
    
            while( input.size() > 0 && (ch = input.front())){
                v_result.push_back(ch);
                input.pop();
    
                switch(ch){
                case '(':case '{':case '[':case '<':
                    s_storage.push(v_result.size()-1);              
                    break;
                case ')':case '}':case ']':case '>':
                    if( s_storage.size() == 0 || v_result[(s_storage.top())] != get_pair(ch) ){
                        char higher = get_higher_priority(v_result[(s_storage.top())], get_pair(ch));
                        if(ch == higher){
                            v_result[(s_storage.top())] = get_pair(higher);
                            s_storage.pop();
                        }else{
                            v_result.at(v_result.size()-1) = higher;
                        }
                    }else{
                        s_storage.pop();
                    }
                    break;      
                }
            }
            for(int i=0; i<v_result.size(); i++){
                cout<<v_result[i];
            }
            cout<<endl;
        }
    
    };
    
    int main(){
        vector<God_sohyun> v;
        int testcases;
        cin>>testcases;
    
        for(int i=0; i<testcases; i++){
            char input[MAX_LENGTH], _priority[COUNT_OF_PARENTHESE+1];
            cin>>input>>_priority;
            v.push_back(*(new God_sohyun(input, _priority)));
        }
    
        for(int i=0; i<v.size(); i++){
            v[i].run();
        }
        return 0;
    }
    

    9년 전
2개의 댓글이 있습니다.
  • kcm1700
    kcm1700

    데이터 아무렇게나 입력해서 돌려봤더니 제대로 안 나오네요.

    ({(])) {(<[
    -> ({())} 나옴

    한번 확인해보세요.


    9년 전 link
  • kcm1700
    kcm1700

    그리고 테스트케이스를 마지막에 몰아서 수행할 필요는 없어요. 또 *(new God_...))은 필요 없고 v.push_back(God_sohyun(...)) 또는 v.emplace_back(input, _priority) 하세요.


    9년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.