[문제]
출처 - 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;
    }
}
'프로그래머스' 카테고리의 다른 글
| [프로그래머스 Level2] 순위 검색(JAVA) - 2021 카카오 (0) | 2022.03.30 | 
|---|---|
| [프로그래머스 Level1] 숫자 문자열과 영단어(JAVA) - 2021 Kakao (0) | 2022.03.13 | 
| [프로그래머스 Level2] 문자열 압축 (JAVA) - 2020 Kakao (0) | 2022.02.01 | 
| [프로그래머스 Level3] - 디스크 컨트롤러 (JAVA) (2) | 2022.01.17 | 
| [프로그래머스 Level2] 더 맵게 (JAVA) (0) | 2022.01.12 |