티스토리 뷰

괄호 회전하기

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

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

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


제한사항
  • s의 길이는 1 이상 1,000 이하입니다.

입출력 예sresult
"[](){}" 3
"}]()[{" 2
"[)(]" 0
"}}}" 0

입출력 예 설명

입출력 예 #1

  • 다음 표는 "[](){}" 를 회전시킨 모습을 나타낸 것입니다.
xs를 왼쪽으로 x칸만큼 회전올바른 괄호 문자열?
0 "[](){}" O
1 "](){}[" X
2 "(){}[]" O
3 "){}[](" X
4 "{}[]()" O
5 "}[](){" X
  • 올바른 괄호 문자열이 되는 x가 3개이므로, 3을 return 해야 합니다.

입출력 예 #2

  • 다음 표는 "}]()[{" 를 회전시킨 모습을 나타낸 것입니다.
xs를 왼쪽으로 x칸만큼 회전올바른 괄호 문자열?
0 "}]()[{" X
1 "]()[{}" X
2 "()[{}]" O
3 ")[{}](" X
4 "[{}]()" O
5 "{}]()[" X
  • 올바른 괄호 문자열이 되는 x가 2개이므로, 2를 return 해야 합니다.

코드

import java.util.*;
class Solution {
    public int solution(String s) {
        int answer = 0;
        String temp=s;
        //괄호 회전시키기
        for(int n=0;n<s.length();n++){
            if(checking(temp))answer++; //확인이 끝난 후 true면 answer이 증가
            temp = temp.substring(1,s.length())+temp.charAt(0);
        }return answer;
    }

        //괄호 확인하기
         boolean checking(String s){
            Stack<Character> stack = new Stack<>();
            for(int k=0;k<s.length();k++){
                try{
                    switch(s.charAt(k)){
                        case '[':
                            stack.push('[');
                            break;
                        case ']':
                            if(stack.peek() != '[') return false;
                            stack.pop();
                            break;
                        case '{':
                            stack.push('{');
                            break;
                        case '}':
                            if(stack.peek() != '{') return false;
                            stack.pop();
                            break;
                        case '(':
                            stack.push('(');
                            break;
                        case ')':
                            if(stack.peek() != '(') return false;
                            stack.pop();
                            break;    
                    }
                }catch(Exception e){
                    return false;
                }
            }
            return stack.empty()? true: false;
    }
}

 

이번문제는 문제를 이해하는데도 시간을 써야했고 처음에 자릿수를 매겨서 검사해볼려고 하다가 너무 지저분하게 길어지는 것 같아서 다른 사람들의 팁을 보니 stack으로 풀어보면 좋다고 하여 stack방식을 써보기로 했다.

stack의 정의는 시험볼때 매번 나오는 부분이었으니 정의는 알고있었는데 막상 써볼려서 생각처럼 잘 되지가 않아 다른 사람의 코드를 먼저 보기로 했다.

 

다른 사람이 한 코드를 보고 이해하고 나서 나도 보지 않고 문제를 진행해보았다.

역시 레벨2 문제는 더 생각을 많이 해야하고 사용하게 되는 것도 폭도 늘어나 계속 하다보면 도움이 많이 될 것 같다.

 

stack.push() 값 추가
stack.pop() 값 제거
stack.peek() 최상단 값 확인(값 제거X)

stack 사용법 및 예제 참고 글
https://hbase.tistory.com/122
괄호 회전하기 코드 참고 글
https://dev-note-97.tistory.com/262

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함