FIXPAREN 질문입니다. 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; } 11년 전
2개의 댓글이 있습니다. kcm1700 데이터 아무렇게나 입력해서 돌려봤더니 제대로 안 나오네요. ({(])) {(<[ -> ({())} 나옴 한번 확인해보세요. 11년 전 link kcm1700 그리고 테스트케이스를 마지막에 몰아서 수행할 필요는 없어요. 또 *(new God_...))은 필요 없고 v.push_back(God_sohyun(...)) 또는 v.emplace_back(input, _priority) 하세요. 11년 전 link 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
pushbell7
제가 무언가 놓치고 있는 것 같은데 무엇을 놓치고 있는지 모르겠습니다.
두 괄호가 다르다면 mismatched 경우이므로 둘의 우선순위를 비교해 더 높은 우선순위를 갖는 괄호로 맞추어줍니다.
get_pair 함수는 닫는 괄호를 입력으로 받아 해당 여는 괄호를 리턴합니다.
get_higher_priority 함수는 여는 괄호를 입력으로 받아 우선순위를 비교하고 해당하는 닫는 괄호를 리턴합니다.
소스코드입니다.
11년 전