Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

csct3434

[level 2] 괄호 변환 - 60058 본문

프로그래머스

[level 2] 괄호 변환 - 60058

csct3434 2024. 2. 29. 03:25

문제 링크

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

import java.util.Stack;

class Solution {

    public String solution(String p) {
        // Phase 1
        if (p.isEmpty()) {
            return p;
        }

        // Phase 2
        int idx = 0, count = 0;
        while (idx < p.length()) {
            count += (p.charAt(idx++) == '(') ? 1 : -1;

            if (count == 0) {
                break;
            }
        }

        String u = p.substring(0, idx);
        String v = p.substring(idx);

        // Phase 3
        if (check(u)) {
            return u + solution(v);
        }

        // Phase 4
        return "(" + solution(v) + ")" + flip(u.substring(1, u.length() - 1));
    }

    private boolean check(String s) {
        Stack<Character> stack = new Stack<>();

        for (char c : s.toCharArray()) {
            if (c == ')') {
                if (stack.isEmpty()) {
                    return false;
                }
                stack.pop();
                continue;
            }

            stack.push('(');
        }

        return stack.isEmpty();
    }

    private String flip(String s) {
        StringBuilder result = new StringBuilder();

        for (char c : s.toCharArray()) {
            if (c == '(') {
                result.append(')');
                continue;
            }
            result.append('(');
        }

        return result.toString();
    }
}