[프로그래머스,Level 2] 올바른 괄호 (JAVA 구현)
코테/프로그래머스(Programmers)

[프로그래머스,Level 2] 올바른 괄호 (JAVA 구현)

반응형

- 첫 풀이 및 정답풀이

  이 문제를 읽고 처음에는 정렬을 통해 각각의 괄호 개수를 카운팅 하는 방식으로 풀어보고자 했지만, 다시 생각해보니 주어진 문자열의 괄호들의 순서가 변하면 안된다는 사실을 알 수 있었다. 따라서 문자열 s를 탐색하면서 풀어나가야 되겠다고 생각했다.

 

  우선 첫 번째로 배제한 경우는 문자열 s의 첫 문자가 ) 닫힌 괄호가 먼저 나오는 경우였다. 이렇게 처리하면 다음으로 고려해야 하는 것은 ( 열린 괄호부터 시작하는 경우뿐이다. 본인은 열린괄호의 개수를 통해 풀어보고자 했다.

 

  1. 열린 괄호가 나오면 open이라는 변수를 증가시킨다.

  2. 닫힌 괄호가 나오면 open을 감소시킨다.

  3. 단, 열린 괄호가 1개 나온 상태에서 닫힌 괄호가 2번 나오는 경우를 배제하기 위해 닫힌 괄호를 만나면 open의 값을 체크한다.

  4. 문자열 탐색을 마쳤을 때, open이 0이 아니라면 짝이 맞지 않는 것이므로 배제한다.

 

class Solution {
    boolean solution(String s) {
        boolean answer = true;
        // 1. 열린 괄호 개수를 저장하는 변수.
        int open = 0;
       
        // 2. 첫 문자가 닫힌 괄호인 경우는 바로 false.
        if(s.charAt(0) == ')') return false;
        
        // 3. 문자열 탐색.
        for(int i = 0;i<s.length();i++){    
            // 4. 열린 괄호를 만나면 open은 증가.
            if(s.charAt(i)=='(') {
                open++;                
            }
            // 5. 닫힌 괄호를 만난 경우는
            else {     
                // 6. open값을 우선 탐색, 열린 괄호의 수 < 닫힌 괄호의 수 인 경우는 false.
                if(open <= 0 ) return false;
                // 7. 위의 조건에 걸리지 않으면 open은 감소.
                open--;              
            }            
        }
        
        // 8. 모든 과정이 끝났을 때 open이 0이 아니라면 짝이 맞지 않으므로 false.
        if(open != 0) return false;
        
        // 9. 위의 모든 조건에서 걸리지 않는다면 그대로 true 반환.
        return answer;
    }
}

  다른 분들은 대다수가 스택을 이용해 푼 것 같다. 다음에 도전해봐야지.

반응형