본문 바로가기

알고리즘/프로그래머스

[프로그래머스/C++] 알고리즘 - 괄호 변환

안녕하세요! 테크지니어22입니다.

오늘은 프로그래머스 알고리즘 - 괄호 변환을 풀어보도록 하겠습니다.

 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

[문제 접근]

문제가 길어서 읽으면서 머릿 속에 막 들어오지 않아서 최대한 적으면서 조건들을 분기화하면서 읽었습니다.

이해가 안되는 부분들은 예제들을 보면서 최대한 이해하려고 했습니다. 문제는 재귀함수가 가미된 단순 구현문제였습니다.

아래처럼 적으면서 읽었습니다.

 

[풀이 전략]

위에 작성한 문제 접근방법을 아래와 같이 조금 더 단순화 시킨 후 바로 구현을 했습니다.

 

[코드]

#include <string>
#include <vector>

using namespace std;


bool isGoodBracket(string s) {
    int val = 0 ;
    for(auto c: s){
        if(c == '(') val++;
        else if(c ==')') val--;
        if (val < 0) return false ;
    }
    return true ;
}

string func(string s){
    if(s == "") return ""; // 빈문자열이면 빈문자열 반환
    string u = "";
    string v = "";
    //문자열 분리.
    // ( -> +1 ,, ) -> -1 ;
    int val = 0 ; 
    for(int i = 0 ; i < s.length();i++){
        if(s[i] == '(') val++;
        else if(s[i] ==')') val--;
        if(val == 0) {
            u = s.substr(0,i+1); 
            v = s.substr(i+1,s.length()-u.length());
            break;
        }
    }
    if(isGoodBracket(u)) { // u가 올바른 문자열이면
        auto r = func(v);
        return u+r ; 
    }
    else { // u가 올바른 문자열이 아니라면
        string tmpstr = "(";
        tmpstr += func(v);
        tmpstr += ")";

        u = u.substr(1,u.length()-2);
        for(auto &c :u) {
            if(c == '(') c = ')';
            else if(c == ')') c = '(';
        }
        
        tmpstr += u ;
        return tmpstr ;
    }
}
string solution(string p) {
    return func(p);
}

 

[배울 점]

- 문제 읽으면서 호기심과 인내심, 풀수 있다는 마인드를 가지고 읽기.