카카오코테 - 괄호 변환

greenTea·2023년 9월 10일
0

코드

class Solution {
    public String solution(String p) {
        return dfs(p);
    }
     private  String dfs(String p) {
        if (p.isBlank())
            return p;

        int f1 = 0;
        int f2 = 0;
        int index = 0;
        while (index < p.length()) {
            if (p.charAt(index) == '(')
                f1++;
            else
                f2++;
            if (f1 == f2)
                break;
            index++;
        }
        String u = p.substring(0, index+1);
        String v = p.substring(index+1);

        return check(u) ? u + dfs(v) : "(" + dfs(v) + ")" + change(u);
    }


    private  String change(String p) {
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i < p.length() - 1; i++) 
            sb.append(p.charAt(i) == '(' ? ')' : '(');
        return sb.toString();
    }

    private  boolean check(String p) {
        Stack<Character> stack = new Stack<>();
        for (char c : p.toCharArray()) {
            if (c == ')' && !stack.isEmpty() && stack.peek() == '(')
                stack.pop();
            else 
                stack.push('(');  
        }
        return stack.isEmpty();
    }
}

풀이

🤔문제에 주어진 과정을 그대로 로직으로 만드신다면 해결이 가능한 문제입니다.
문제가 길어서 1번부터 차근차근 해야 헷갈리지 않고 푸실 수 있습니다.

  1. p가 비어있다면 그대로 반환
  2. p를 u,v로 나누기 위해 f1,f2변수 설정 -> while문을 통해 p를 분리하는데 f1==f2가 되면 while문 종료 그리고 해당 index를 토대로 u,v로 분리
  3. u를 검사하였을때 정상적인 괄호라면 u + 다음 dfs()를 수행 그렇지 않다면 "(" + dfs(v) + ")" + change(u)를 수행(로직에 나와 있는 그대로 수행하시면 됩니다.)
  4. check()함수의 경우 stack을 이용하여 "()"짝이 맞는지 확인하는 메소드입니다.
    stack"("이 들어간 상황에서 다음 차례가 ")"라면 stack.pop()으로 제거 그 이외에는
    "("라는 의미로 그대로 push()
  5. change()메소드는 문제의 4-4번 로직을 수행한 메소드로 앞뒤를 제거하기 위해 for문의 시작과 끝을 1만큼 이동 이후 하나식 검사하면서 해당 값들을 반대로 적용

🥳요구하는 상황에 맞게 로직을 구현한다면 풀 만한 문제였던 것 같습니다.

출처 : 프로그래머스 - 괄호 변환

profile
greenTea입니다.

0개의 댓글