https://programmers.co.kr/learn/courses/30/lessons/60058
#include <string>
#include <vector>
using namespace std;
// 문자열의 앞뒤를 자르고 괄호 반전
string make_reverse_except_ft(const string &u)
{
string tmp = u.substr(1, u.size() - 2);
for (char &c : tmp)
{
c = ((c == '(') ? ')' : '(');
}
return tmp;
}
// 틀린 문자열 시작 인덱스 반환
int get_wrong_string_start(const string &s)
{
int cnt = 0;
int balanced = 0;
for (int i = 0; i < s.size(); ++i)
{
if (s[i] == '(')
++cnt;
else
--cnt;
if (cnt == 0)
{
balanced = i;
break;
}
}
return balanced + 1;
}
// 올바른 괄호 문자열 여부 체크
bool is_right_string(const string& s)
{
int cnt = 0;
for (const char &c : s)
{
if (c == '(')
++cnt;
else
--cnt;
if (cnt < 0)
return false;
}
return (cnt > 0) ? false : true;
}
bool make_balanced_string(const string& s, string& u, string& v)
{
// 빈 문자열이 주어졌을 때
if (s.size() == 0)
{
return false;
}
int v_strt = get_wrong_string_start(s);
u = s.substr(0, v_strt);
v = s.substr(v_strt);
return true;
}
string make_right_string(const string &s)
{
string u = "";
string v = "";
// 올바른 문자열 or 빈 문자열이 주어졌을 경우 : 입력 문자열 그대로 반환
if (make_balanced_string(s, u, v) == false || is_right_string(s))
{
return s;
}
// u가 올바른 문자열O : u + v재귀 호출 결과 반환
if (is_right_string(u))
{
return u + make_right_string(v);
}
// u가 올바른 문자열X : ( + v재귀 호출 결과 + ) + u의 앞뒤를 자르고 괄호 반전한 결과 반환
return '(' + make_right_string(v) + ')' + make_reverse_except_ft(u);
}
string solution(string p) {
return make_right_string(p);
}
이 무슨말이야... 싶을정도로 문제가 되게 안읽혔다
하지만 다 구현해놓고 보니, 오히려 문제는 그냥 코드를 문장으로 써놓았을 뿐이었다.
이제 한글보다 코드가 쉬운가보네 내가 껄껄
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스]힙(Heap) : 라면공장 (level 2)(c++) (0) | 2020.05.14 |
---|---|
[프로그래머스]힙(Heap) : 더 맵게(level 2) (c++) (0) | 2020.05.13 |
[프로그래머스]2017 카카오코드 예선 : 카카오프렌즈 컬러링북 (level 2)(c++) (0) | 2020.05.11 |
[프로그래머스]Summer/Winter Coding(~2018) : 스킬트리 (level 2) (c++) (0) | 2020.05.10 |
[프로그래머스]해시 : 전화번호 목록 (level 2) (c++) (0) | 2020.05.08 |
댓글