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

[ 프로그래머스 / 구현 ] 괄호 변환 (KaKao)

by 뎁꼼 2020. 7. 2.

1. 문제


 

 

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

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

programmers.co.kr

 

2. 소스코드


- 처음 문제를 보면 장문에 현기증.

- 근데 문제에 정답이 있다.

- 문제에 적힌대로 그냥 아무생각 없이 "그대로 구현"만 하면 된다.

 

소스코드

#include <string>
#include <algorithm>
#include <stack>
using namespace std;

bool isRight(string str){
    stack <char> st;
    for(char ch : str){
        if(ch == ')' and !st.empty() and st.top() == '(') 
            st.pop();
        else 
            st.push(ch);
    }
    if(!st.size()) return true;
    return false;
}

string splitU(string p){
    string u = "";
    int cnt = 0;
    for(int i = 0; i < p.size(); ++i){
        if(p[i] == '(') cnt++;
        else cnt--;
        u += p[i];
        if(cnt == 0) 
            return u;
    }
}

string recur(string p){
    if(p == "") return p;
    string u = splitU(p);
    string v = "";
    if(u.size() != p.size()) 
        v = p.substr(u.size());
    if(isRight(u)) {
        return u += recur(v);
    }
    else{
        string temp = "(";
        temp += recur(v);
        temp += ')';
        u = u.substr(1,u.size()-2);
        
        for(int i = 0 ; i < u.size(); ++i)
            if(u[i] == '(') u[i] = ')';
            else u[i] = '(';
        
        temp += u;
        return temp;
    }
}

string solution(string p) {
    if(isRight(p)) return p;
    return recur(p);
}