본문 바로가기
Problem-solving/프로그래머스

프로그래머스 - (2020 KAKAO BLIND RECRUITMENT) 괄호 변환 (Java)

by taehee.kim.dev 2020. 11. 23.

programmers.co.kr/learn/courses/30/lessons/60058

 

코딩테스트 연습 - 괄호 변환

카카오에 신입 개발자로 입사한 콘은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를 컴

programmers.co.kr

import java.util.Stack;

class Solution {

    private final Stack<String> stack = new Stack<>();

    public String solution(String p) {
        return this.convert(p);
    }

    private String convert(String s){
        if (s.isEmpty()){
            return "";
        }

        int i = 1;
        String u = null;
        String v = null;
        while (i <= s.length()){
            u = s.substring(0, i);
            v = s.substring(i);
            if (this.isBalancedParentheses(u)){
                break;
            }
            i += 1;
        }

        if (this.isRightParentheses(u)){
            return u + this.convert(v);
        }else{
            String ret = "(";
            ret += this.convert(v);
            ret += ')';
            u = u.substring(1, u.length() - 1);
            u = this.reverseParentheses(u);
            ret += u;
            return ret;
        }
    }

    private String reverseParentheses(String u) {
        String result = "";
        for (int i = 0; i < u.length(); i++){
            if (u.charAt(i) == '('){
                result += ')';
            }else{
                result += '(';
            }
        }
        return result;
    }

    private boolean isBalancedParentheses(String s){
        int left = 0;
        int right = 0;
        for (int i = 0; i < s.length(); i++){
            if (s.charAt(i) == '('){
                left += 1;
            }else{
                right += 1;
            }
        }
        return left == right;
    }

    private boolean isRightParentheses(String s){
        for (int i = 0; i < s.length(); i++){
            if (s.charAt(i) == '('){
                this.stack.push("(");
            }else{
                if (stack.isEmpty()){
                    return false;
                }else if (stack.peek().equals("(")){
                    stack.pop();
                }
            }
        }
        return stack.isEmpty();
    }
}

댓글