[Programmers] level 2 - 괄호 변환 (2020 KAKAO BLIND RECRUITMENT)

Lynn·2021년 2월 18일
0

Algorithm

목록 보기
33/43
post-thumbnail

👩🏻‍💻 문제


이해 중에 끄적인 낙서...

👩🏻‍💻 정답 코드

import java.util.Stack;

class Solution {
    public static String solution(String p){
        String answer = "";
        
        StringBuilder sb = new StringBuilder();
        Stack<Character> stack = new Stack<>();
        
        int i = 0;
        char c;
        
        // <1단계>
        if (p.isEmpty()) return "";

        // <2단계>
        c = p.charAt(i++);
        stack.push(c);
        if (c=='('){
            while(!stack.isEmpty()){
                c = p.charAt(i++);
                if (c==')') stack.pop();
                else stack.push(c);
            }
        }
        else {
            while(!stack.isEmpty()){
                c = p.charAt(i++);
                if (c=='(') stack.pop();
                else stack.push(c);
            }
        }
        String u = p.substring(0,i);
        String v = p.substring(i);

        // <3단계>
        if (correct(u)){
            sb.append(u);
            sb.append(solution(v));
        }
        
        // <4단계>
        else {
            sb.append('('); // <4-1>
            sb.append(solution(v)); // <4-2>
            sb.append(')'); // <4-3>
            for (int j=1; j<u.length()-1; j++){ // <4-4>
                if (u.charAt(j)=='(') sb.append(')');
                else sb.append('(');
            }
        }
        answer = sb.toString();
        return answer;
    }

    public static Boolean correct(String u){
        Stack<Character> stack = new Stack<>();
        for (int i=0; i<u.length(); i++){
            char c = u.charAt(i);
            if (c=='(') stack.push(c);
            else{
                if (stack.empty()) return false;
                else stack.pop();
            }
        }
        return true;
    }
}

StringBuilder를 이용해서 문자열을 붙인 후 리턴했다.
문제에서 제시한 풀이 단계를 주석으로 달아 놨다.
뒤쪽 문자열 v는 재귀로 리턴값 얻음

correct 메소드는 전에 풀었던 문제 코드 복붙

profile
wanderlust

0개의 댓글