Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

Life Engineering

[프로그래머스] 괄호 변환 (C++) 본문

Problem Solving

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

흑개 2021. 9. 30. 22:45

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

 

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

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

programmers.co.kr

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

bool isCorrect(string p){
    stack<char> s;
    for (char c: p){
        if (c=='(')
            s.push(c);
        else{
            if (s.empty())
                return false;
            else
                s.pop();
        }
    }
    return true;
}

string convert(string p){
    if (p.size()==0)
        return "";
    int pos=0;
    int cnt=0;
    string u="";
    string v="";
    while (pos<p.size()){      
        if (p[pos]=='(')
            cnt++;
        else
            cnt--;
        u+=p[pos];
        pos++;
        if (cnt==0)
            break;
    }
    if (pos<p.size())
        v+=p.substr(pos,p.size()-pos);  
    if (isCorrect(u))
        return u+convert(v);
    else{
        string temp="(";
        temp+=convert(v);
        temp.push_back(')');
        for (int i=1; i<u.size()-1; i++){
            if (u[i]=='(')
                temp.push_back(')');
            else
                temp.push_back('(');
        }
        return temp;
    }
}


string solution(string p) {
    if (isCorrect(p)){
        return p;
    } 
    string answer = convert(p);
    return answer;
}

 

명세대로 그대로 구현하기만 하면 되는 문제.

여기서 구현해야 될 부분은 균형잡힌 문자열로 쪼개는 부분, 올바른 균형잡힌 문자열인지 판정하는 부분이다.

 

균형잡힌 문자열로 쪼갤때는 (와 )가 나올 때 카운트를 증가, 감소시켜 주면서 카운트가 0이 될때 문자열을 쪼개준다.

올바른 균형잡힌 문자열인지 판단하는건 스택을 이용했다. ( 일때는 스택에 넣고, ) 일 때는 스택에 빼준다. ) 가 스택이 비었는데 나왔을 경우, 올바르지 않다고 판단한 후 false를 리턴한다.