https://school.programmers.co.kr/learn/courses/30/lessons/60058
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
"올바른 괄호 문자열"로 변환하는 과정대로 작성하면 된다.
올바른 괄호인지 판단하는 함수를 따로 빼주었고 u,v로 나누는 함수도 따로 만들어줬었는데
그렇게 되면 재귀적으로 u,v가 바뀌었다가 다시 원래 u,v로 안바뀌는 것같아서 안되었다.
그래서 문자열을 분리하는 부분은 솔루션함수 안에다가 넣어주었다.
#include <string>
#include <vector>
#include<stack>
#include<iostream>
using namespace std;
char t;
string u,v,tmp,uu;
bool checkS(string p)
{
stack<char>s;
int size=p.size();
for(int i=0;i<size;i++)
{
if(p[i]==')')
{
if(s.size()>0)
{
t=s.top();
s.pop();
if(t!='(')//짝이 없을 경우
return false;
}
else
return false;//스택에 짝이 없을 경우
}
else
s.push(p[i]);
}
return true;
}
void separation(string t)
{
int cnt1=0,cnt2=0;
for(int i=0;i<t.size();i++)
{
if(t[i]=='(')
cnt1++;
else
cnt2++;
u+=t[i];
if(cnt1==cnt2)
{
for(int j=i+1;j<t.size();j++)
v+=t[j];
return;
}
}
}
string solution(string p) {
string answer = "";
if(p.size()==0)
return answer;
if(checkS(p))
return p;
//u,v로 나누기
string u,v;
int cnt1=0,cnt2=0;
for(int i=0;i<p.size();i++)
{
if(p[i]=='(')
cnt1++;
else
cnt2++;
u+=p[i];
if(cnt1==cnt2)
{
for(int j=i+1;j<p.size();j++)
v+=p[j];
break;
}
}
//u가 올바른 괄호 문자열이라면 1단계부터 다시 수행
if(checkS(u)) {
v = solution(v);
answer = u + v;
return answer;
}
else{
//u가 올바른 괄호 문자열이 아니라면
answer="(";
//문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어붙인다.
answer = answer + solution(v);
//다시 ')'를 붙인다.
answer+=")";
//uu="";
u.erase(0,1);
u.erase(u.length()-1,1);
for(int i=0;i<u.size();i++)
{
if(u[i]=='(')
answer+=")";
else
answer+="(";
}
return answer;
}
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 행렬 테두리 회전하기 (0) | 2023.03.24 |
---|---|
[프로그래머스] 멀쩡한 사각형 c++ (0) | 2023.03.02 |
[프로그래머스] 오픈채팅방 c++ (0) | 2023.02.17 |
[프로그래머스] 전화번호 목록 c++ (0) | 2023.02.17 |
[프로그래머스] 삼각 달팽이 c++ (0) | 2023.02.05 |