Algorithm/Programmers

[프로그래머스] 괄호 변환 - Java

ikjo 2022. 5. 18. 14:51

문제 설명

 

 

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

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

programmers.co.kr

 

접근 방법

파라미터로 입력받은 괄호 문자열을 문제에서 주어진 방식대로 변환시켜주면 됩니다.

 

우선 첫 번째 조건에 따르면 입력(String p)이 빈 문자열인 경우, 단순히 빈 문자열을 반환하기만 하면됩니다.

 

	if (p.isEmpty()) return p;

 

그렇지 않을 경우 해당 문자열(반드시 균형잡힌 괄호 문자열)을 두 개의 문자열로 분리하는데 이 중 하나는 더 이상 분리될 수 없는 균형잡힌 괄호 문자열, 나머지 하나는 이외 나머지의 문자열로 빈 문자열이 될 수도 있습니다. 그리하여 해당 문자열을 문자(char)형 배열로 변환 후 첫 번째로 발견되는 균형잡힌 괄호 문자열(u)과 이외 나머지 문자열(v)을 추출하여 2개의 문자열 배열로 반환하도록 했습니다.

 

    private String[] splitBracket(String p) {
        String[] result = new String[]{"", ""};
        char[] brackets = p.toCharArray();
        int count = 0;

        for (int i = 0; i < brackets.length; i++) {
            if (brackets[i] == '(') {
                count++;
                result[0] += "(";
            }
            else {
                count --;
                result[0] += ")";
            }
            if (count == 0) {
                if (i != brackets.length - 1)
                    result[1] = p.substring(i + 1);
                break;
            }
        }

        return result;
    }

 

다음으로 첫 번째 문자열(u)이 올바른 괄호 문자열인지를 검증하도록 했습니다. 이때 검증 방식은 문자열의 각 문자를 순회할 때 ')'가 더 많아지는 경우(항상 올바르지 않은 괄호 문자열)를 체크(check)하여 올바른지를 검증했습니다.

 

    private boolean verify(String p) {
        char[] chars = p.toCharArray();
        int count = 0;

        for (char aChar : chars) {
            if (aChar == '(')
                count++;
            else
                count--;

            if (count < 0) {
                return false;
            }
        }

        return true;
    }

 

이때 올바르다면 두 번째 문자열(v)에 대해 앞선 작업들을 반복하여 얻은 문자열을 첫 번째 문자열(u) 뒤에 붙여 반환하도록 했습니다. 만일 올바르지 않다면 '('와 ')' 사이에 두 번째 문자열(v)에 대해 앞선 작업들을 반복하여 얻은 문자열을 붙이고 맨 뒤에 첫 번째 문자열(u)의 앞뒤 문자 제거 및 뒤집기에 대한 결과를 붙여 반환하도록 합니다. 이때 문자열의 앞뒤 문자 제거 및 뒤집기 처리는 다음과 같이 구현했습니다.

 

    private String reverseString(String p) {
        String temp = p.substring(1, p.length() - 1);
        StringBuilder sb = new StringBuilder();
        char[] chars = temp.toCharArray();
        for (char c : chars) {
            if (c == '(') {
                sb.append(')');
            } else {
                sb.append('(');
            }
        }

        return sb.toString();
    }

 

 

전체 소스 코드

class Solution {

    public String solution(String p) {
        if (p.isEmpty()) return p;

        String[] result = splitBracket(p);
        if (verify(result[0])) {
            return result[0] += solution(result[1]);
        }
        else {
            return "(" + solution(result[1]) + ")" + reverseString(result[0]);
        }
    }
    
    private String[] splitBracket(String p) {
        String[] result = new String[]{"", ""};
        char[] brackets = p.toCharArray();
        int count = 0;

        for (int i = 0; i < brackets.length; i++) {
            if (brackets[i] == '(') {
                count++;
                result[0] += "(";
            }
            else {
                count --;
                result[0] += ")";
            }
            if (count == 0) {
                if (i != brackets.length - 1)
                    result[1] = p.substring(i + 1);
                break;
            }
        }

        return result;
    }

    private boolean verify(String p) {
        char[] chars = p.toCharArray();
        int count = 0;

        for (char aChar : chars) {
            if (aChar == '(')
                count++;
            else
                count--;

            if (count < 0) {
                return false;
            }
        }

        return true;
    }

    private String reverseString(String p) {
        String temp = p.substring(1, p.length() - 1);
        StringBuilder sb = new StringBuilder();
        char[] chars = temp.toCharArray();
        for (char c : chars) {
            if (c == '(') {
                sb.append(')');
            } else {
                sb.append('(');
            }
        }

        return sb.toString();
    }
}

 

 

참고자료