알고리즘 문제풀이/카카오

[2020 카카오 코딩테스트] 괄호 변환

홍시홍 2020. 3. 26. 21:28

분류 : 구현

 

요구사항

1. 올바른 괄호 문자열 판단

2. 균형잡힌 괄호 문자열 만들기

 

풀이

문제에 조건들이 상세히 나와있고 구현이 중요한 문제이다

1. 올바른 괄호 문자열 판다

 - stack을 활용하여 '('과 ')'를 이용하여 판단

2. 균형잡힌 괄호 문자열 만드리

 - '(', ')'의 개수로 판단한다

3. 나머지는 문제에 주어진대로 백트래킹을 활용해 구현한다

 

#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <iostream>
using namespace std;

string ans="";
bool check(string org){
    int cnt=0;
    if(org.size()==0)
        return true;
    stack<char> q;
    q.push(org[0]);
    for(int i=1 ; i <org.size() ; i++){
        char now = org[i];
        if(q.empty()){
            q.push(now);
        }
        else{
            char qtop = q.top();
            if(qtop ==')'){
                q.push(now);
            }
            else if(qtop=='('){
                if(now==')'){
                    q.pop();
                }
                else{
                    q.push(now);
                }
            }
        }
    }
    if(q.empty()) return true;
    else return false;
}


string dfs(string org, string a, string b){
    if(check(org))
        return org;
    if(org.empty())
        return "";
    int cntH=0;
    int cntL=0;
    string newstr;
    int cnt=0;
    for(int i=0 ; i <org.size(); i++){
        //홀수 개
        if(org[i]=='('){
            cntH++;
            newstr+=org[i];
        }
        else if(org[i]==')'){
            cntL++;
            newstr+=org[i];
        }
        if(cntH!=0 && cntL!=0){
            if(cntH == cntL){
                break;
            }
        }
        cnt++;
    }
    if(check(newstr)){
        return newstr+=dfs(org.substr(cnt+1,-1),"","");
    }
    else{
        string Nstr;
        Nstr += '('; 
        string Sstr = dfs(org.substr(cnt+1,-1),"","");
        Nstr += Sstr;
        Nstr += ')';
        auto iter =newstr.begin();
        newstr.erase(iter);
        iter=newstr.end();
        iter--;
        newstr.erase(iter);
        string nowNstr;
        for(int i=0 ; i <newstr.size(); i++){
            if(newstr[i] =='(' )
                nowNstr.push_back(')');
            else
                nowNstr.push_back('(');
        }
        Nstr+=nowNstr;
        return Nstr;
    }
}

string solution(string p) {
    string answer = "";
    answer += dfs(p,"","");
    return answer;
}

/*
1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다. 
2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 
단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다. 
3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다. 
  3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다. 

4. 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다. 
  4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다. 
  4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다. 
  4-3. ')'를 다시 붙입니다. 
  4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다. 
  4-5. 생성된 문자열을 반환합니다.
*/