본문 바로가기
정리/알고리즘

프로그래머스 - 괄호 변환

by Hudini30 2022. 4. 13.

프로그래머스 (카카오 블라인드 테스트) -괄호 변환

해당 문제는 문제 내용 그대로 구현하였습니다. 이를 구현하기 위해 스택을 사용 하였습니다. u 와 v 를 나누는 기준을 스택이 empty가 되는 순간을 기준으로 u,v를 나누었고 스택에 넣는 기준은 스택의 peek값과 비교하는 값이 다른 경우에 pop 같은 경우에 push를 해주어 최초 균형잡힌 괄호 문자열이 되는 순간의 index 값을 구하였습니다., 올바른 괄호 문자열인 경우는 스택에 '(' 인 경우에만 푸쉬를 하고 스택이 empty가 아닌 상태에서 ')' 문자를 만난 경우 스택에서 pop을 해주는 방식으로 최종적으로 스택이 empty인 경우 올바른 괄호 문자열인 것으로 판단 했습니다.

public String solution(String p) {
        if (p.isEmpty()) {
            return "";
        }

        if (isBraketConversion(p)) {
            return p;
        }

        String[] test = splitUV(p);
        if (isBraketConversion(test[0])) {
            return test[0] + solution(test[1]);
        } else {
            String temp = test[0].substring(1, test[0].length() - 1);

            return "(" + solution(test[1]) + ")" + convertBracket(temp);
        }
    }

    private String convertBracket(String temp) {
        StringBuilder stringBuilder = new StringBuilder();

        for (int i = 0; i < temp.length(); i++) {
            String a = temp.substring(i, i + 1);
            if (a.equals("(")) {
                stringBuilder.append(")");
            } else {
                stringBuilder.append("(");
            }
        }

        return stringBuilder.toString();
    }

    private String[] splitUV(String str) {
        String u = "";
        String v = "";
        int splitIndex = str.length();
        Stack<String> stack = new Stack<>();
        stack.push(str.substring(0, 1));

        for (int i = 1; i < str.length(); i++) {
            String temp = str.substring(i, i + 1);
            if (stack.isEmpty()) {
                splitIndex = i;
                break;
            }
            if (!stack.peek().equals(temp)) {
                stack.pop();
            } else {
                stack.push(temp);
            }
        }

        u = str.substring(0, splitIndex);
        v = str.substring(splitIndex);
        return new String[]{u, v};
    }

    private boolean isBraketConversion(String str) {
        Stack<String> stack = new Stack<>();
        String startStr = str.substring(0, 1);

        if (startStr.equals(")")) {
            return false;
        }

        stack.push(startStr);

        for (int i = 1; i < str.length(); i++) {
            String temp = str.substring(i, i + 1);
            if (stack.isEmpty() && temp.equals(")")) {
                return false;
            }
            if (!stack.isEmpty() && temp.equals(")")) {
                stack.pop();
            } else if (temp.equals("(")) {
                stack.push(temp);
            }
        }

        return stack.isEmpty();
    }

댓글