본문 바로가기

알고리즘 풀이/프로그래머스

[프로그래머스] 괄호 변환 / 2020 KAKAO BLIND RECRUITMENT - JAVA

🔗 문제 링크

[프로그래머스] 괄호 변환 / 2020 KAKAO BLIND RECRUITMENT

 

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

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

programmers.co.kr

 

📝 풀이 과정

문제만 이해하면 그대로 구현하면 되는 문제이다.

()   => 균형잡힌 괄호 문자열(O), 올바른 괄호 문자열(O)
)(   => 균형잡힌 괄호 문자열(O), 올바른 괄호 문자열(X)
)((  => 균형잡힌 괄호 문자열(X), 올바른 괄호 문자열(X)

 

균형잡힌 괄호로 나눠주기 위해 '('는 +1, ')'는 -1로 계산하며 값이 0이 되면 균형잡힌 괄호로 판단하고 반복문을 탈출해주었다. 구해준 idx로 문자열을 u와 v로 분할하고 u가 올바른 괄호 문자열인지 다시 한 번 판별한다. 이전과 같은 방식으로 진행하지만 진행하면서 음수가 나온다면 올바른 괄호가 아니므로 false를 반환하고 아니라면 true를 반환한다.

 

u가 올바른 괄호 문자열로 판단되면 u에 v를 올바른 괄호 문자열로 만들기 위해 다시 함수를 돌려 반환값을 붙여 반환한다. 아니라면 v의 앞뒤에 '(', ')'를 붙여주고, u의 앞뒤 문자를 제거하고 괄호의 방향을 뒤집어 붙인 결과를 반환한다.

 

💻 코드

class Solution {
    public String solution(String p) {
        return solve(p);
    }

    String solve(String s) {
        if (s.length() == 0) return s;

        int idx = 0, cnt = 0;
        for (; idx < s.length(); idx++) {
            cnt += s.charAt(idx) == '(' ? 1 : -1;
            if (cnt == 0) break;
        }
        String u = s.substring(0, ++idx), v = solve(s.substring(idx));

        if (check(u)) return u + v;
        else
            return "(" + v + ")" +
                    u.substring(1, u.length() - 1).chars()
                            .mapToObj(i -> i == '(' ? ')' : '(')
                            .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append);
    }

    boolean check(String str) {
        int cnt = 0;
        for (char ch : str.toCharArray()) {
            if (ch == '(') cnt++;
            else if (--cnt < 0) return false;
        }
        return true;
    }
}