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

Elmo·2023년 4월 5일
0
post-custom-banner

문제 푸는 것보다 읽는게 더 힘든거 같은 문제 ㅎ
그냥 바로 입출력 예제와 설명보는게 이해하기 더 쉽다!

🔔Thinking

judge() : 올바른 괄호 문자열 판단

  1. String s를 받아서 첫 문자가 ) 이면 -> false
  2. ( -> left ++
  3. ) 이면 left를 감소시켜서 괄호가 쌍을 이루는지 판단
    left < 0 -> false

recur() : 문자열을 u, v로 분리하여 재귀적으로 올바른 괄호 문자열로 변환함

  1. String s를 받아서 빈문자열이거나 올바른 괄호 문자열이면 return
  2. ( -> left++ , ) -> right++ 해서 둘의 개수가 같아지면 해당 인덱스까지를 u에 저장함. 나머지는 v
  3. u가 올바른 괄호 문자열이면 u 뒤에 recur(v)를 붙임(재귀)
    -> v는 다시 1단계부터 재수행하는 것
  4. u가 올바른 괄호 문자열이 아니면

    ( recur(v) ) 뒤에
    u의 앞뒤 문자를 삭제한 나머지 문자열을 하나하나 반대로 뒤집어서 붙임.
    -> u.substring(1, u.length()-1).toCharArray();
    -> 단 length가 2이하면 결국 ""가 되므로 수행할 필요 없음.

🔑Solution

import java.util.*;
class Solution {
    static boolean judge(String s){
        int left=0;
        if(s.charAt(0)==')') return false;
        for(int i=0; i<s.length(); i++) {
            if(s.charAt(i)=='(') left++;
            else{
                left--;
                if(left<0) return false;
            }
        }
        return true;
    }
    static String recur(String s){
        if(s.equals("")||judge(s)) return s;
        int left=0,right=0,i=0;
        for(i=0;i<s.length(); i++){
            if(s.charAt(i)=='(') left++;
            else right++;

            if(left==right) break;
        }
        String u = s.substring(0,i+1);//u
        String v = s.substring(i+1,s.length());//v
        System.out.println("u : "+u+"v : "+v);
        if(judge(u)) //u가 올바른 괄호 문자열
            return u+recur(v); //나머지 v를 1단계부터 다시 수행
        else{ //u가 올바른 괄호 문자열이 아님
            String str ="("+recur(v)+")";
            char[] u2;
            if(u.length()>2) {
                u2 = u.substring(1, u.length()-1).toCharArray();
                for(int j=0; j<u2.length; j++){
                    if(u2[j]=='(')
                        u2[j]=')';
                    else
                        u2[j]='(';
                    str += u2[j];
                }
            }
            return str;
        }
    }
    public String solution(String p) {
        return recur(p);
    }
}
profile
엘모는 즐거워
post-custom-banner

0개의 댓글