- 문제에서 지시하는 데로 구현해야 올바른 괄호 문자열이 만들어지는데, 재귀를 이용해야한다.
- 괄호가 올바른지, 균형잡혔는지 카운트하기 위해서 스택을 이용하거나 혹은 직접 int변수로 카운트 할 수 있다.
- 처음 시작 시에 균형잡힌 문자열이 주어지는 것을 이용해서 p를 2개의 균형잡힌 문자열 u,v로 나눈 뒤에 그 중 u를 옳바른 문자열로 만들어 주고, 남은 v를 재귀적으로 다시 같은 로직을 이용하여 결과적으로 옳바른 문자열 + 옳바른 문자열 + 옳 +옳... 을 리턴하도록 만들어주는 것이 포인트이다.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
bool isCorrect(string& s) {
int open = 0;
for (char& ch : s) {
if (ch == '(')
++open;
else
--open;
if (open < 0) return false;
}
if (open == 0) return true;
return false;
}
string solution(string p) { // p는 균형잡힌 괄호 문자열
if (p == "") return "";
int pos, open = 0;
for (int i = 0; i < p.length(); ++i) {
if (p[i] == '(')
++open;
else
--open;
if (open == 0) {
pos = i + 1;
break;
}
}
string u = p.substr(0, pos);
string v = p.substr(pos);
if (isCorrect(u)) return u + solution(v);
for (char& ch : u) {
if (ch == '(')
ch = ')';
else
ch = '(';
}
return '(' + solution(v) + ')' + u.substr(1, u.size() - 2);
}
'Algorithm > programmers' 카테고리의 다른 글
2020 Kakao blind 60060 - 가사검색(이분탐색, 트라이 자료구조) c++ (0) | 2021.09.09 |
---|---|
2020 Kakao blind 60059 - 자물쇠와 열쇠(완전탐색, 배열) c++ (0) | 2021.09.09 |
2020 Kakao internship 67259 - 경주로 건설(다익스트라, 0-1 bfs) c++ (0) | 2021.09.06 |
2020 Kakao internship 67258 - 보석 쇼핑(슬라이딩 윈도우) c++ (0) | 2021.09.06 |
2020 Kakao internship 67257 - 수식 최대화(파싱, 완전탐색, 배열) c++ 풀이 (0) | 2021.09.06 |