해설
지시문의 순서대로 문자열을 올바른 괄호 문자열로 변환하는 문제이다.
전체 코드
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <tuple>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <climits>
#include <set>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
using ii = pair<int, int>;
using ss = pair<string, string>;
using iii = tuple<int, int, int>;
#define X first
#define Y second
bool correct(string s) {
stack<char> st;
for (auto c : s) {
if (c == '(') st.push('(');
else if (c == ')' && !st.empty() && st.top() == '(') st.pop();
else return false;
}
return true;
}
ss split(string w) {
vector<int> cnt(2, 0);
int i;
for (i = 0; i<w.size(); i++) {
if (w[i] == '(') cnt[0]++;
else cnt[1]++;
if (cnt[0] == cnt[1]) break;
}
//{u, v} 리턴
return {w.substr(0, ++i), w.substr(i)};
}
string convert(string w) {
if (w == "") return w;
//w를 u와 v로 분리
ss tmp = split(w);
string u = tmp.X, v = tmp.Y;
//분리된 u가 올바른 문자열일 때 v를 수정하고 결합하여 리턴
if (correct(u)) return u+convert(v);
//분리된 u가 올바른 문자열이 아닐 때 처리
string ret = "("+convert(v)+")";
u.erase(u.begin());
u.pop_back();
//u의 괄호 방향을 거꾸로 변경
for (auto& c : u) {
if (c == '(') c = ')';
else c = '(';
}
return ret+u;
}
string solution(string p) {
//p가 올바른 문자열일 경우 그대로 출력
if (correct(p)) return p;
//변환하여 출력
return convert(p);
}
'대딩 > 프로그래머스풀이' 카테고리의 다른 글
[프로그래머스 lv1] 실패율 풀이 (0) | 2022.03.17 |
---|---|
[프로그래머스 lv2] 메뉴 리뉴얼 풀이 (0) | 2022.03.16 |
[프로그래머스 lv2] 단체사진찍기 풀이 (0) | 2022.03.15 |
[프로그래머스 lv2] 카카오프렌즈컬러링북 풀이 (0) | 2022.03.15 |
[프로그래머스 lvl1] 키패드누르기 풀이 (0) | 2022.03.14 |
댓글