관리 메뉴

fatalite

프로그래머스 - 괄호 변환 본문

코딩 인터뷰/C++

프로그래머스 - 괄호 변환

fataliteforu 2024. 9. 29. 13:57

주어진 내용을 그대로 구현하면 된다.

내가 구현하려고 했으면 시간이 오래 걸렸을 듯 하다. 

 

관련된 내용은

- 스택(그러나, 나는 올바른 괄호 구하는데 스택을 사용하지 않았다.)

- 재귀(스택과 재귀!)

- string을 잘 다룰 수 있는가?

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

bool isRight(string s)
{
    int cnt = 0;
    for(char c : s)
    {
        if(c == '(')
        {
            cnt++;
        }
        else
        {
            if(cnt == 0)
            {
                return false;
            }
            cnt--;
        }
    }
    return true;
}

pair<string, string> GetBalanced(string s)
{
    int cntOpen = 0;
    int cntClose = 0;
    string u = "";
    string v = "";
    for(char c : s)
    {
        if(c == '(')
        {
            cntOpen++;
        }
        else
        {
            cntClose++;
        }
        u.push_back(c);
        if(cntClose == cntOpen)
        {
            break;
        }
    }
    
    return {u, s.substr(cntOpen + cntClose, 999)};
}

string Find(string s)
{
    if(s.empty()) return "";
    pair<string,string> uvPair = GetBalanced(s);
    string u = uvPair.first;
    string v = uvPair.second;
    if(isRight(u))
    {
        string answer = Find(v);
        u.append(answer);
        return u;
    }
    else
    {
        string answerU = "";
        answerU.push_back('(');
        string answerV = Find(v);
        answerU.append(answerV);
        answerU.push_back(')');
        cout << u << endl;
        for(int i = 1 ; i < u.length() -1 ; i++ )
        {
            if(u[i] == '(')
            {
                answerU.push_back(')');
            }
            else
            {
                answerU.push_back('(');
            }
        }
        return answerU;
    }
}

string solution(string p) {
    return Find(p);
}