알고리즘/PS - 프로그래머스

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

excited-hyun 2021. 7. 9. 18:05
반응형

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

 

코딩테스트 연습 - 괄호 변환

카카오에 신입 개발자로 입사한 "콘"은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를

programmers.co.kr

 

풀이

문제 이해부터가 쉽지않다... 말이 너무 복잡하달까... 코테 푸는데에도 이젠 국어 능력이 중요해지는 시대이다...

그래서 문제의 설명을 한 단계씩 작성해 보았다.

막상 쓰고 보면 그냥 문제의 설명을 따라서 코드를 구현하기만 하면 되는 문제이다.

 

#include <string>
#include <vector>
#include <stack>

using namespace std;

//올바른 괄호인지 확인
bool check(string str){
    stack<char> s;
    for(int i=0; i<str.length(); i++){
        if (str[i] == '(')
            s.push(str[i]);
        else if (str[i] == ')'){
            if(s.empty())
                return false;
            s.pop();
        }
    }
    return true;
}

//재귀로 구현한 단계들
string solve(string str){
    
    string u = "", v = "";
    int open=0, close=0;
    
    //빈 문자열인지
    if(str=="")
        return "";
    //올바른 괄호인지
    if(check(str))
        return str;
    
    for(int i=0; i<str.length(); i++){
        if(str[i] == '('){
            open++;
            u = u+str[i];
        }
        else{
            close++;
            u = u+str[i];
        }
        
        //u를 균형잡힌 문자열로 만들었음
        if(open == close){
            //u가 올바른 문자열
            if(check(u)){
                v = str.substr(i+1);
                return u+solve(v);
            }
            //u가 올바른 문자열이 아님
            else{
                v = str.substr(i+1);
                string temp = "";
                temp += "(";
                temp = temp + solve(v);     //v에 대해 1단계부터 반복
                temp = temp+")";
                
                //u의 맨앞 맨뒤 제거
                u = u.substr(1, u.length()-2);
                //뒤집어서 추가
                for (int j = 0; j < u.length(); j++) {
                    if (u[j] == '(')
                        temp = temp + ')';
                    else
                        temp = temp + '(';
                }
                return temp;
            }
                
        }
        
    }
}

string solution(string p) {
    string answer = "";
    
    answer = solve(p);
    
    return answer;
}
728x90
반응형