오늘의 알고리즘

[C++]2020 KAKAO BLIND RECRUITMENT괄호 변환(프로그래머스 2레벨)

하늘하늘 . 2022. 2. 15. 21:31
#include <string>
#include <vector>
 
using namespace std;
 
string Change(string p)
{
    if (p == "")
        return p;
 
    int iSize = p.size();
    int iPlus = 0;
    bool bWhere = false;
 
    // 처음 시작이 제대로인지 체크
    if (p[0] == '(')
        bWhere = true;
    else
        bWhere = false;
 
    for (int i = 0; i < iSize; ++i)
    {
        if (p[i] == '(')
            ++iPlus;
 
        else if (p[i] == ')')
            --iPlus;
 
        // 세트가 정해지고 제대로된 상태라면 제대로 시작
        if (iPlus == 0 && bWhere)
        {
            string iFirst = p.substr(0, i + 1);
            string iEnd = p.substr(i + 1, iSize - i);
            return iFirst + Change(iEnd);
        }
 
        // 세트가 정해지고 잘 못 시작되었다면 변경 
        else if (iPlus == 0 && !bWhere)
        {
            if (i > 2)
            {
                string iFirst = p.substr(1, i - 1);
 
                int iFirstSize = iFirst.size();
 
                for (int i = 0; i < iFirstSize; ++i)
                {
                    if (iFirst[i] == '(')
                        iFirst[i] = ')';
                    else if (iFirst[i] == ')')
                        iFirst[i] = '(';
                }
 
                string iEnd = p.substr(i + 1, iSize - i);
                return "(" + Change(iEnd) + ")" + iFirst;
            }
 
            else
            {
                string iEnd = p.substr(i + 1, iSize - i);
                return "(" + Change(iEnd) + ")";
            }
        }
    }
}
 
string solution(string p)
{
    return Change(p);
}

문제를 잘 못 해석해서 좀 헤맸다.

문제를 이해만 잘했다면 바로 풀었을 수도 있었을 문제

+ 앞에서 "(" 시작이면 끝이 어떻게 되든 제대로 닫힐 예정이라 상관없다.