본문 바로가기
알고리즘/프로그래머스

[프로그래머스] 괄호변환 c++

by 오오오니 2023. 2. 24.

https://school.programmers.co.kr/learn/courses/30/lessons/60058

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 "올바른 괄호 문자열"로 변환하는 과정대로 작성하면 된다.

올바른 괄호인지 판단하는 함수를 따로 빼주었고 u,v로 나누는 함수도 따로 만들어줬었는데

그렇게 되면 재귀적으로 u,v가 바뀌었다가 다시 원래 u,v로 안바뀌는 것같아서 안되었다.

그래서 문자열을 분리하는 부분은 솔루션함수 안에다가 넣어주었다.

 

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

char t;
string u,v,tmp,uu;

bool checkS(string p)
{
    stack<char>s;
    int size=p.size();
    for(int i=0;i<size;i++)
    {
        if(p[i]==')')
        {
            if(s.size()>0)
            {
                t=s.top();
                s.pop();
                if(t!='(')//짝이 없을 경우
                    return false;              
                    
            }
            else
                return false;//스택에 짝이 없을 경우
        }
        else
            s.push(p[i]);
    }
    return true;
    
}
void separation(string t)
{
    int cnt1=0,cnt2=0;
    
    for(int i=0;i<t.size();i++)
    {
        if(t[i]=='(')
            cnt1++;
        else
            cnt2++;
        u+=t[i];
        if(cnt1==cnt2)
        {
            for(int j=i+1;j<t.size();j++)
                v+=t[j];
            return;
        }
            
    }
}


string solution(string p) {
    string answer = "";
    if(p.size()==0)
        return answer;
   if(checkS(p))
       return p;
   
        //u,v로 나누기
        string u,v;
       int cnt1=0,cnt2=0;
    
    for(int i=0;i<p.size();i++)
    {
        if(p[i]=='(')
            cnt1++;
        else
            cnt2++;
        u+=p[i];
        if(cnt1==cnt2)
        {
            for(int j=i+1;j<p.size();j++)
                v+=p[j];
            break;
        }
            
    }
      
        //u가 올바른 괄호 문자열이라면 1단계부터 다시 수행
        if(checkS(u)) {
          v = solution(v);
          
           answer = u + v;
         
          return answer;
         }
        else{
        //u가 올바른 괄호 문자열이 아니라면
         answer="(";
        //문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어붙인다.
         answer = answer + solution(v);
        
        //다시 ')'를 붙인다.
        answer+=")";
       
        //uu="";
        u.erase(0,1);
        u.erase(u.length()-1,1);
           
        for(int i=0;i<u.size();i++)
        {
            if(u[i]=='(')
                answer+=")";
            else
                answer+="(";
        }
    
       
          return answer;
    }
}