코딩테스트 문제풀이/프로그래머스

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

itaeiou 2020. 2. 27. 23:11
반응형

프로그래머스

카카오 2020 블라인드 테스트

 

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

 

코딩테스트 연습 - 괄호 변환 | 프로그래머스

카카오에 신입 개발자로 입사한 콘은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를 컴파일하여 로그를 보니 대부분 소스 코드 내 작성된 괄호가 개수는 맞지만 짝이 맞지 않은 형태로 작성되어 오류가 나는 것을 알게 되었습니다. 수정해야 할 소스 파일이 너무 많아서 고민하던 콘은 소스 코드에 작성된 모든 괄호를 뽑아서 올바른 순서대로 배치된 괄호 문자열을 알려주는

programmers.co.kr

 

#include <string>
#include <vector>

using namespace std;

string check(string w);

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

string check(string w) {
    string u,v;
    int wsize = w.size();
    int wcnt = 0;
    
    if(w == "") return "";
    
    for(int i=0; i<wsize; i++) {
        if(w[i] == '(') wcnt++;
        else wcnt--;
        if(wcnt == 0) {
            u = w.substr(0,i+1);
            v = w.substr(i+1,wsize-(i+1));
            break;
        }
    }
    
    int usize = u.size();
    int vsize = v.size();
    int ucnt = 0;
    for(int i=0; i<usize; i++) {
        if(u[i] == '(') ucnt++;
        else ucnt--;
        if(ucnt < 0) break;
    }
    if(ucnt == 0) {
        v = check(v);
        return u + v;
    }
    else {
        string str = "";
    
        str += '(';
        str += check(v);
        str += ')';        
        u = u.substr(1,usize-2);
        usize = u.size();
        
        for(int i=0; i<usize; i++) {
            if(u[i] == '(') str += ')';
            else str += '(';
        }
        return str;
    }
}

 

반응형