프로그래머스

[프로그래머스 Level2] 괄호 변환 (JAVA) - 2020 Kakao

쿠쿠s 2022. 2. 6. 13:51

[문제]

출처 - https://programmers.co.kr/learn/courses/30/lessons/60058?language=java 

 

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

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

programmers.co.kr


[문제 풀기 전]

이 문제에 처음 접근할 때 2번 u, v  를 나누는 처리와 재귀의 처리가 좀 까다로웠다. 재귀는 그냥 진짜 문제에서 하라는대로 반환(return) 하면 되는 것이였고..  u,v 를 나눌 때 따로 ' ( ' 와 ' ) ' 개수가 같아질 때는 생각했는데 문자열을 나누고 만드는 부분이 미숙하였다. 카카오 문제를 풀면서 느낀건 내가 아직 문자열 문제에 많이 취약하다는 것을 느꼈다.

 

 


[문제 풀이]

 

구현력을 요구하는 문제로서 문제에 나와있는대로 따라가면서 코드를 작성하면 된다.

두 균형잡힌 괄호 문자열  u, v 로 분리해야 하는데  u 는 `균형잡힌 괄호 문자열`로 더 이상 분리 할 수 없어야 한다.

즉, ' ( ' 의 개수와 ' ) ' 의 개수가 처음으로 같아 질때 분리해야한다. 분리하기 위해서는 분리할 포인트를 가지고 있어야 하기 때문에 u 가 만들어 지점에서 위치를 멤버 변수에 저장하도록 구현한다.

 

위치 값과 올바른 괄호 문자열을 판단하는 메서드를 만드는데 반환값의 힌트는 3번 과 4번에서 확인 할 수 있다.

`올바른 괄호 문자열` 일때와 아닐 때의 과정으로 나누어져 있어 문제에서 주어진 문자열을 u, v 로 분리하기 전 스택을 활용하여 '올바른 괄호 문자열 인지 판단' 하여 True / False 반환한다.

 

나머지는 주어진대로 구현을 하면 됩니다.

소스코드를 참고하시면 됩니다!

 


[소스 코드]

import java.util.*;

class Solution {
    int pos;

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

        //2번
        boolean isBalance = balanceString(p);
        String u = p.substring(0, pos);
        String v = p.substring(pos, p.length());

        //3번
        if(isBalance){
            //3-1
            return u + solution(v);
        }else{
            //4번
            //4-1
            String answer = "(";

            //4-2
            answer += solution(v);

            //4-3
            answer += ')';

            //4-4
            for (int i = 1; i < u.length() - 1; i++) {
                if (u.charAt(i) == '(') {
                    answer += ")";
                }else{
                    answer += "(";
                }
            }

            return answer;
        }

    }

    public boolean balanceString(String s) {
        Stack<Character> stack = new Stack<>();
        boolean checkBalance = true;
        int left = 0;
        int right = 0;

        for (int i = 0; i < s.length(); i++) {

            if (s.charAt(i) == '(') {
                left++;
                stack.push('(');
            }else{
                right++;
                if (stack.isEmpty()) {
                    checkBalance = false;
                }else {
                    stack.pop();
                }
            }

            if (left == right) {
                pos = i + 1; // u 와 v 자르는 지점 ,  u 의 끝 , v 의 시작
                return checkBalance;
            }
        }
        return true;
    }
}