풀면서 게속 들은 생각은 파이썬으로 풀었다면 정말 쉽게 풀었겠다... 라는 것
문제에서 대놓고 재귀함수를 사용하라고 알려주고 있듯이 재귀함수로 구현하면 풀 수 있다.
재귀만 돌리면 풀 수 있는 문제라 딱히 설명할 것이 없는데, 계속 StringBuilder를 만들어주는게 여간 귀찮은게 아니었다.
그냥 더해도 되긴 하지만 문자열과 문자열을 쌩으로 더하는 건 괜히 찝찝하다...
점점 알고리즘을 풀면서 클래스를 만들거나, 함수로 나누어서 푸는것에 익숙해지고있다.
삼성 역량테스트 B형을 못 따면 B형 특강은 다른 회사 코테와 많이 달라 공부가 의미 없다고 이야기하는 사람들도 많고, 은근 공감도 하지만
그래도 알고리즘 푸는 능력 향상에 꽤 도움이 되는 건 인정 안 할 수가 없다.
import java.util.*;
class Solution {
public String solution(String p) {
String answer = "";
answer = getUV(p);
return answer;
}
private static String getUV(String p){
if(p.equals("")) return "";
StringBuilder sb = new StringBuilder();
String[] uv = new String[2];
int left = 0;
int right = 0;
int idx = 0;
for(int i=0; i<p.length(); i++){
if(p.charAt(i)=='('){
left +=1;
}else{
right +=1;
}
if(left == right){
sb.append(p.charAt(i)+"");
idx = i;
break;
}else{
sb.append(p.charAt(i)+"");
}
}
String u = "";
if(sb.length() !=0){
u = sb.toString();
}
sb.setLength(0);
for(int i=idx+1; i<p.length(); i++){
sb.append(p.charAt(i)+"");
}
String v = "";
if(sb.length() != 0){
v = sb.toString();
}
uv[0] = u;
uv[1] = v;
if(check(u)){
return u + getUV(v);
}
StringBuilder tmpSb = new StringBuilder();
tmpSb.append("(");
tmpSb.append(getUV(v));
tmpSb.append(")");
u = u.substring(1, u.length()-1);
for(int i=0; i<u.length(); i++){
if(u.charAt(i) == '('){
tmpSb.append(")");
}else{
tmpSb.append("(");
}
}
return tmpSb.toString();
}
private static boolean check(String u){
Stack<Character> stack = new Stack<>();
for(int i=0; i<u.length(); i++){
if(u.charAt(i) == '('){
stack.push('(');
}else{
if(stack.isEmpty()){
return false;
}else{
stack.pop();
}
}
}
if(!stack.isEmpty()){
return false;
}else{
return true;
}
}
}