알고리즘/프로그래머스
2020 카카오 기출 괄호 변환
dev.moon
2020. 3. 13. 23:50
https://programmers.co.kr/learn/courses/30/lessons/60058
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
유형: 문자열 변환
- is_check()에서 stack을 활용하여 "올바른"인지 "균형잡힌" 인지 구분한다
- is_check()에서 "올바른"과 "균형잡힌"의 경계선을 구한다.
- substr을 활용하여 u,v로 나눈다
/*
main
입력
ans+=solution
출력
solutioin w
if 빈 문자
리턴
flag = is_check w
pos를 구했으니 u,v 알 수 있음
if 균형이면
tmp = ( + solution v + )
u의 pop_front, pop_back
for u의 길이
반대로 업데이트
tmp + 위에 반대로 업데이트한거
return tmp
is_check w
int ret
stack<char> s;
for 문자열길이
if '('
푸시
ret++
else ')'
if 빈공간 아닐시
팝
ret--;
if ret ==0
pos는 끊을 위치
if s가 비었으면
올바른
return true
else
균형
return false
*/
#include<iostream>
#include<deque>
#include<stack>
#include<string>
using namespace std;
int pos;
bool is_check(string p)
{
int ret = 0;
pos = 0;
stack<char> st;
for (int i = 0; i < p.size(); i++)
{
if (p[i] == '(')
{
st.push('(');
ret++;
}
else {
if (!st.empty())
{
st.pop();
}
ret--;
}
if (ret == 0)
{
pos = i+1;
if (st.empty())
{
return true;
}
else {
return false;
}
}
}
}
string solution(string p)
{
if (p.length() == 0) return "";
bool flag = is_check(p);
string u = p.substr(0, pos);
string v = p.substr(pos, p.size()-pos);
if (flag)
{
return u+solution(v);
}
else
{
string tmp = "(" + solution(v) + ")";
for (int i = 1; i < u.size()-1; i++)
{
if (u[i] == ')')
{
tmp += "(";
}
else
{
tmp += ")";
}
}
return tmp;
}
}
int main() {
string p;
cin >> p;
string ans=solution(p);
cout << ans;
}