Algorithm

[Algorithm] 괄호 변환

씬프 2021. 6. 14. 12:27
반응형
 

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

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

programmers.co.kr

 

풀이

먼저, 해당 문제는 시키는대로 잘 따라가면 된다.

 

순서대로 진행하는데, 균형잡힌 문자열과 올바른 문자열에 대해서 어떻게 판단할 것인지 생각해야한다.

균형 잡힌 문자열은 개수가 같은 것이기 때문에 '(' 와 ')'의 갯수가 동일한 경우의 index를 반환한다.

올바른 문자열은 '('와 ')'의 균형이 맞으면서 순서도 맞아야 한다. ')'이 먼저 나오는 경우 안된다.

 

나머지 부분은 문제에 정의된 부분대로 구현하면 되었다.

class Solution {
    
    public int findIndex(String p) {
        int cnt = 0;
        for (int i = 0; i < p.length(); i++) {
            if (p.charAt(i) == '(') cnt++;
            else cnt--;
            if (cnt == 0) return i;
        }
        return -1;
    }
    
    public boolean check(String p) {
        int cnt = 0;
        for (int i = 0; i < p.length(); i++) {
            if (p.charAt(i) == '(') cnt++;
            else {
                if (cnt == 0) return false;
                cnt--;
            }
        }
        return true;
    }
    
    public String solution(String p) {
        String answer = "";
        
        if (p.equals("")) return answer;
        int index = findIndex(p);
        String u = p.substring(0, index+1);
        String v = p.substring(index+1);
        
        if (check(u)) {
            answer = u + solution(v);
        } else {
            answer = "(";
            answer += solution(v);
            answer += ")";
            u = u.substring(1, u.length() - 1);
            String tmp = "";
            for (int i = 0; i < u.length(); i++) {
                if (u.charAt(i) == '(') tmp += ')';
                else tmp += '(';
            }
            answer += tmp;
        }
        
        
        return answer;
    }
}

'Algorithm' 카테고리의 다른 글

[Algorithm] 안테나  (0) 2021.06.16
[Algorithm] 인구 이동  (0) 2021.06.15
[Algorithm] 연산자 끼워 넣기  (0) 2021.06.13
[Algorithm] 감시 피하기  (0) 2021.06.12
[Algorithm] 경쟁적 전염  (0) 2021.06.11