프로그래머스 - 괄호 변환 - Java - 재귀

chaemin·2024년 3월 7일
0

프로그래머스

목록 보기
5/64

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/60058

2. 풀이

이 문제는 재귀를 잘 알아야 풀 수 있는 문제이다.
구현은 문제에서 주어진대로 구현하고
구현 시 필요한 재귀를 잘 활용하는 것이 문제의 목적이다.

2-1. ✨핵심 Point

  • 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;

3. 코드

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;
    }
}

0개의 댓글