코딩문제풀이/프로그래머스

[Java] 프로그래머스 : 괄호 변환

코딩하는 포메라니안 2022. 8. 7. 10:56

1. 문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

2. 풀이 과정

1. 균형 잡힌 괄호 문자열 + 올바른 괄호 문자열을 동시에 확인한다.

- 열린 괄호가 오면 +1, 닫힌 괄호가 오면 -1 => 중간에 한 번이라도 음수가 되면, 올바른 괄호 문자열이 아니다.

 

2. u가 올바른 괄호 문자열인지에 따라, 다르게 처리하고 재귀함수를 돌린다.

- '올바른'이면, u + 재귀(v)

- '올바른'이 아니면, ( 재귀(v) ) + 뒤집은 u

 

class Solution {
    
    public String solution(String p) {
        if(p.equals("")){
            return "";
        }
        //1. 최소 균형 잡힌 괄호 문자열 u 찾기 + 올바른 괄호 문자열 확인
        int n = p.length();
        int pair=0, i=0;
        boolean isRight = true;
        do{
            if(p.charAt(i)=='('){pair++;}
            else{pair--;}
            //닫는 문자열이 먼저 나올 경우
            if(pair<0){
                isRight = false;
            }
            i++;
        }while(pair!=0);
        
        //2. 올바른 문자열인지 판단 후, 재귀
        if(isRight){
            StringBuilder sb = new StringBuilder();
            sb.append(p.substring(0, i)).append(solution(p.substring(i, n)));
            return sb.toString();
        }
        else{
            String u = "";
            int size = i-1;
            //뒤집기
            for(int a=1; a<size; a++){
                switch(p.charAt(a)){
                    case '(':
                        u+=")";
                        break;
                    case ')':
                        u+="(";
                        break;
                }
            }
            StringBuilder sb = new StringBuilder();
            sb.append("(").append(solution(p.substring(i, n))).append(")").append(u);
            return sb.toString();
        }
    }
}