코딩 테스트

(Java) 프로그래머스 괄호 변환

로승리 2022. 3. 6. 16:53

예전에 레벨 1에서 봤던 괄호 문제보다 몇 단계 어려운 문제같이 느껴졌다.

문제가 상세한 요구사항이 있었는데 이를 하나씩 따라가면 답이 나오는 문제였다.

다만, 그 과정은 쉽지 않아 많이 고민했었다.

키포인트는 결국 재귀였는데 메서드를 분리해서 재귀를 구현하는 게 익숙하지 않아

디버그 모드를 많이 이용하여 풀었다.

 

최종 코드

import java.util.Stack;
class Solution {
    public static String solution(String p) {
        // 입력 문자열이 공백이면 공백반환
        if(p.equals("")) {
            return "";
        }
        int cnt = 0;
        StringBuilder sb = new StringBuilder(p);
        StringBuilder u = new StringBuilder();
        StringBuilder v = new StringBuilder();
        StringBuilder answer = new StringBuilder();

        for (int i = 0; i < p.length(); i++) {
            if(sb.charAt(i) == '(') {
                cnt++;
            } else if(sb.charAt(i) == ')') {
                cnt--;
                // cnt가 0이라는건 (와 )의 짝이 맞는다는것
            } if(cnt == 0) {
                u.append(sb.substring(0, i+1));
                v.append(sb.substring(i+1));
                break;
            }
        }

        // 재귀 실행
        if(IsCorrect(u.toString())) {
            // 올바른 문자열이라면
            return u.append(solution(v.toString())).toString();
        }

        // 올바른 문자열이 아니면
        answer.append("(").append(solution(v.toString())).append(")");
        // 앞뒤 문자 제거
        u.deleteCharAt(0);
        u.deleteCharAt(u.length()-1);
        // 반환
        answer.append(switching(u.toString()));
        return answer.toString();
    }

    // 올바른 문자열인지 확인하는 메서드
    public static boolean IsCorrect (String u) {
        Stack<String> st = new Stack<>();
        // 스텍에 (만 넣어주고 )를 만나면 스텍에서 제거
        for (String i : u.split("")) {
            if(i.equals("(")) {
                st.push(i);
            } if(!st.isEmpty() && i.equals(")")) {
                st.pop();
            }
        }
        // 스텍의 사이즈가 0이면 올바른 문자열
        return st.size() == 0;
    }

    // 괄호를 뒤집는 메서드
    public static String switching(String u) {
        StringBuilder sbs = new StringBuilder();
        for (int i = 0; i < u.length(); i++) {
            if(u.charAt(i) == '(') {
                sbs.append(')');
            } else {
                sbs.append('(');
            }
        }
        return sbs.toString();
    }
}