괄호 변환

유태형·2022년 3월 10일

문제

문제 분석

특이하게도 알고리즘을 문제에서 제시하였습니다. 어려워서라기 보단 모호해질수 있어서 그런것 같네요.
균형잡힌 괄호 문자열올바른 괄호 문자열이 무엇을 뜻하는지와 문제에서 설명하는 변환방식이 어떤 건지 정확히 짚고 가야 다른 길로 빠지는걸 방지할 수 있을것 같습니다.




풀이

임의로 정해놓은 것이 많은 문제여서 의미하는 바가 무엇인지 정확히 짚고 가는것이 중요한 문제인것 같습니다.

목차

1.의미를 정확히 짚고가기
2.u와 v
3.괄호 변환

의미를 정확히 짚고가기

문제에서 설명한 용어를 풀어보겠습니다.

균형잡힌 괄호 문자열 : 문자열 내에()의 수가 동일
올바른 괄호 문자열 : 문자열 내에 ()의 수 뿐만 아니라 순서도 다 맞춤
u : 최소크기의 균형잡힌 괄호 문자열
v : 문자열에서 u를 제외한 뒷 부분
p : 매개변수로 균형잡힌 괄호 문자열

여기서 주의해야 할 것이 두가지 있습니다.

첫번째로 올바른 괄호 문자열균형잡힌 괄호 문자열의 부분집합 인 점입니다. 균형잡힌 괄호 문자열에서 괄호의 순서를 맞추면 올바른 괄호 문자열이 됩니다.

두번째는 균형잡힌 문자열에서 균형잡힌 문자열을 빼면 균형잡힌 문자열입니다. 흔히 짝수 - 짝수 = 짝수듯이 같은 수의 (, )쌍이 나가면 (, )쌍이 유지됩니다.

u와 v

		int bal = BALANCE;
        String v = "";
        int index;

        if (u.equals(""))
            return u;

        //균형잡힙 괄호 문자열 찾기, u찾기
        for(index = 0;index<u.length();index++){
            char c = u.charAt(index);

            //문자'('는 +1, ')'는 -1, 양수면 '('가 많고, 음수면 ')'가 많음
            switch(c){
                case '(':
                    bal++;
                    break;
                case ')':
                    bal--;
                    break;
            }

            if(bal == BALANCE) //+1과 -1갯수 즉 '('와 ')'갯수가 동일
                break;
        }

        v = u.substring(index+1); //뒷 문자열
        u = u.substring(0,index+1); //균형 문자열

u는 최소 크기의 균형잡힌 괄호 문자열이므로 ()의 수가 같은면 반환하는데 이때 (는 +1, )는 -1을 함으로써 0일때 (, )의 수가 같을때 입니다.

괄호 반환

		 //'('로 시작하면 올바른, ')'로 시작하면 균형, 문자열은 무조건 균형임을 응용
        if(u.charAt(0) == '(')
            return u + bracket(v); //3-1
        else{           

            u = u.substring(1,u.length()-1); //4-4  
            u = u.replaceAll("\\(","열");
            u = u.replaceAll("\\)","닫"); //바꾸기위한 치환                    
            u = u.replaceAll("열",")");
            u = u.replaceAll("닫","("); //( 와 )치환

            return "(" + bracket(v) + ")" + u; //4-1, 4-2, 4-3, 4-5
        }

u균형잡힌 괄호 문자열인가 올바른 괄호 문자열인가에 따라 반환하는 문자열이 달라집니다.

올바른 괄호 문자열 : u와 재귀적으로 구한 v를 합칩니다.
균형잡힌 괄호 문자열 : u의 첫, 마지막 괄호를 삭제하고 내부 괄호들은 서로 반대로 치환합니다.




코드

class Solution {
    public static final int BALANCE = 0; //0은 '(' 와 ')'의 수가 같음을 의미
    
    public String solution(String p) {
        String answer = "";
        answer = bracket(p);
        return answer;
    }
    
    //괄호 재귀적
    public static String bracket(String u){
        int bal = BALANCE;
        String v = "";
        int index;
        
        if (u.equals(""))
            return u;
        
        //균형잡힙 괄호 문자열 찾기, u찾기
        for(index = 0;index<u.length();index++){
        	char c = u.charAt(index);
        	
            //문자'('는 +1, ')'는 -1, 양수면 '('가 많고, 음수면 ')'가 많음
            switch(c){
                case '(':
                    bal++;
                    break;
                case ')':
                    bal--;
                    break;
            }
            
            if(bal == BALANCE) //+1과 -1갯수 즉 '('와 ')'갯수가 동일
                break;
        }
        
        v = u.substring(index+1); //뒷 문자열
        u = u.substring(0,index+1); //균형 문자열
        
        //'('로 시작하면 올바른, ')'로 시작하면 균형, 문자열은 무조건 균형임을 응용
        if(u.charAt(0) == '(')
            return u + bracket(v); //3-1
        else{        	
        	
        	u = u.substring(1,u.length()-1); //4-4 	
            u = u.replaceAll("\\(","열");
            u = u.replaceAll("\\)","닫"); //바꾸기위한 치환                    
            u = u.replaceAll("열",")");
            u = u.replaceAll("닫","("); //( 와 )치환
            
            return "(" + bracket(v) + ")" + u; //4-1, 4-2, 4-3, 4-5
        }
    }
}



GitHub

https://github.com/ds02168/Study_Algorithm/blob/master/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4/%EC%9E%90%EB%B0%94/Level2/%EA%B4%84%ED%98%B8%EB%B3%80%ED%99%98.java

profile
오늘도 내일도 화이팅!

0개의 댓글