풀면서 게속 들은 생각은 파이썬으로 풀었다면 정말 쉽게 풀었겠다... 라는 것

 

문제에서 대놓고 재귀함수를 사용하라고 알려주고 있듯이 재귀함수로 구현하면 풀 수 있다.

 

재귀만 돌리면 풀 수 있는 문제라 딱히 설명할 것이 없는데, 계속 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;
        }
    }
}

 

 

 

+ Recent posts