Mini

[틀림] 프로그래머스 괄호변환 // 문자열 substr, 재귀, 시키는대로 본문

Algorithm/문자열

[틀림] 프로그래머스 괄호변환 // 문자열 substr, 재귀, 시키는대로

Mini_96 2025. 4. 5. 13:09

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

* 시도

문제를 예시로 이해하려고 시도 -> 실패

시키는대로만 하면 되는문제..

알고리즘이 주어진것을 코드로 옮기는 능력을 보고싶은듯

 

* 풀이

분리불가 && 균형잡힌 문자열 찾는방법?

substr 사용법

잘못 : substr( a, b) 가 a부터 b까지 X

a부터 b개를 가져오는것임

substr(a) // a부터 끝까지

substr(a,3) // a부터 3개

앞뒤를 자르려면?

u = substr(1, u.size()-2)

괄호 방향을 뒤집어서 뒤에 붙이기

reverse를 사용하면 안됨.

괄호 각각을 뒤집어야함!

// reverse(u.begin(),u.end());
        
string res="";
for(int i=0;i<u.size();++i){
    if(u[i]=='(') res+=")";
    else res+="(";
}

 

전체코드

가끔은 시키는대로만 하는 문제도 나올수 있다(?)

#include <bits/stdc++.h>

using namespace std;

// 올바른 괄호문자열인가?
// 균형은 앞의 for문에서 보장됨
int check(string str){
    stack<char> stk;
    
    for(int i=0;i<str.size();++i) {
        if(str[i]=='('){
            stk.push('(');
        }
        else if (stk.size() && str[i]==')'){
            stk.pop();
        }
    }
    
    if(stk.size()) return 0;
    return 1;
}

string go(string w){
    if(w=="") return "";
    
    int cnt1=0; int cnt2=0;
    int i=0;
    for(;i<w.size();++i){
        if(w[i]=='(') cnt1++;
        else cnt2++;
        if(cnt1==cnt2){
            break;
        }
    }
    //u는 분리불가 && 균형잡힌 문자열 보장
    string u = w.substr(0,i+1);
    string v = w.substr(i+1,w.size());
    
    // cout<<u<<"\n"<<v;
    if(check(u)){
        return u + go(v);
    }
    else{
        string s = "(" + go(v) + ")";
        u = u.substr(1,u.size()-2); //substr(1,2) : 1부터 시작해서 "2개" 가져오기!!
        // reverse(u.begin(),u.end());
        
        string res="";
        for(int i=0;i<u.size();++i){
            if(u[i]=='(') res+=")";
            else res+="(";
        }
        
        s = s + res;
        return s;
    }
    
    
    return "";
}

string solution(string p) {

    return go(p);
}