https://school.programmers.co.kr/learn/courses/30/lessons/60058
이 문제는 재귀를 잘 알아야 풀 수 있는 문제이다.
구현은 문제에서 주어진대로 구현하고
구현 시 필요한 재귀를 잘 활용하는 것이 문제의 목적이다.
- u와 v를 나누어서 계속해서 solution함수를 재귀적으로 호출하는 것이 키포인트이다.
String u = p.substring(0, index+1);
String v = p.substring(index+1);
if(check_u(u))
answer = u + solution(v);
else {
answer = "(";
answer += solution(v);
answer += ")";
u = u.substring(1, u.length() - 1);
for(int i = 0; i < u.length(); i++) {
if(u.charAt(i) == '(')
answer += ")";
else
answer += "(";
}
}
return answer;
class Solution {
public String solution(String p) {
String answer = "";
if(p.equals(""))
return answer;
String arr[] = p.split("");
//1. 일단 u와 v를 구분해야해.
int count = 0;
int index = 0;
// 2. '균형잡힌 문자열'의 인덱스 반환.
for(int i = 0; i < p.length(); i++) {
if(arr[i].equals("("))
count++;
else
count--;
if(count == 0) {
index = i;
break;
}
}
String u = p.substring(0, index+1);
String v = p.substring(index+1);
if(check_u(u))
answer = u + solution(v);
else {
answer = "(";
answer += solution(v);
answer += ")";
// 첫 번째와 마지막 문자 제거. 즉 u = 두번째부터~마지막 전까지 자른 문자열
u = u.substring(1, u.length() - 1);
for(int i = 0; i < u.length(); i++) {
if(u.charAt(i) == '(')
answer += ")";
else
answer += "(";
}
}
return answer;
}
public static boolean check_u(String u){
int ucount = 0;
for(int i = 0; i < u.length(); i++) {
if(u.charAt(i) == '(')
ucount++;
else
ucount--;
if(ucount < 0)
return false;
}
return true;
}
}