프로그래머스

[프로그래머스/Java] 괄호 회전하기

웅둘 2023. 8. 21. 20:56

📚 괄호 회전하기

[JAVA] 프로그래머스 Level 2.

코딩테스트 연습 - 괄호 회전하기 | 프로그래머스 스쿨 (programmers.co.kr)

문제 설명

다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.

  • (), [], {} 는 모두 올바른 괄호 문자열입니다.
  • 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
  • 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.

대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.

제한사항

• s의 길이는 1 이상 1,000 이하입니다.

입출력 예

s result
"{}" 3
"}]()[{" 2
"[)(]" 0
"}}}" 0

문제 해결 방안

'[' , '(', '{' 는 스택에 무조건 넣는다.

그 반대 괄호 문자열이 올 경우 같은 종류로 일치하는 문자열이 반드시 와야한다.

소스 코드

import java.util.*;
class Solution {
    public int solution(String s) {
        int answer = 0;
        

        for(int i=0; i<s.length(); i++) {
            StringBuilder st = new StringBuilder();
            Stack<Character> stack = new Stack<>();
            st.append(s.substring(i, s.length()));
            st.append(s.substring(0, i));
            
            String str = st.toString();
            for(int k=0; k<s.length(); k++) {
                char c = str.charAt(k);
                if(c == '[' || c=='(' || c=='{') {
                    stack.add(c);
                } else {
                    if(stack.size()==0) {
                        break;
                    } else {
                        if(stack.peek()=='[' && c==']') {
                            stack.pop();
                        } else if(stack.peek()=='(' && c==')') {
                            stack.pop();
                        } else if(stack.peek()=='{' && c=='}') {
                            stack.pop();
                        } else {
                            break;
                        }                        
                    }

                }
                
                if(k==s.length()-1 && stack.size()==0) {
                    answer++;
                }
            }
        }
        
        
        return answer;
    }
}