[Programmers] 괄호 회전하기

JaeungE·2021년 7월 8일
0

PS

목록 보기
19/22
post-thumbnail

문제 출처 : [Programmers] 괄호 회전하기, https://programmers.co.kr/learn/courses/30/lessons/76502

👨‍🏫문제

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

  • (), [], {} 는 모두 올바른 괄호 문자열입니다.
  • 만약 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 해야 합니다.

입출력 예 #3

  • s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.

입출력 예 #4

  • s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.

💻코드

import java.util.Stack;

class Solution {
    public int solution(String s) {
        int answer = 0;
        
        StringBuilder sb = new StringBuilder(s);
        
        // 문자열이 올바른 괄호 문자열일 경우 answer 증가.
        for(int i = 0; i < s.length(); i++){
            if(isCorrect(sb.toString())){
                answer++;
            }
            
            // 가장 앞의 괄호를 빼서 문자열의 뒤에 삽입한다.
            sb.append(sb.charAt(0));
            sb.deleteCharAt(0);
        }
        
        return answer;
    }
    
    // 전달 인자로 받은 문자열이 올바른 문자열이면 true, 아니라면 false를 반환하는 함수
    static boolean isCorrect(String str){
        Stack<Character> stack = new Stack<>();
        char first = str.charAt(0);
        
        // 가장 앞의 괄호가 닫힌 괄호면 더 이상 검사하지 않고 즉시 false를 반환
        if(first == ')' || first == '}' || first == ']'){
            return false;
        }
        
        stack.push(first);
        
    	// 열린 괄호 다음 닫힌 괄호가 있다면 stack에서 pop
        for(int i = 1; i < str.length(); i++){
            char c = str.charAt(i);
            
            if(stack.isEmpty()){
                stack.push(c);
                continue;
            }
            
            char peek = stack.peek();
            
            if(peek == '(' && c == ')'){
                stack.pop();
            }else if(peek == '{' && c == '}'){
                stack.pop();
            }else if(peek == '[' && c == ']'){
                stack.pop();
            }else{
                stack.push(c);
            }
        }
        
        // 스택이 비어있다면 올바른 괄호 문자열이므로 true를 반환
        if(stack.isEmpty()){
            return true;
        }
        
        return false;
    }
}

💡후기

돌아온 괄호 문제!!😁

하지만 이번엔 소괄호만 있는 게 아니라, 중괄호와 대괄호도 있기 때문에 조건문이 조금 길어졌다..😔

그래도 여전히 stack을 이용해서 문제를 해결한다는 틀에서 크게 벗어나지는 않아서, 해결 방법에 접근하는 속도도 빨랐고 딱히 예외도 존재하지 않는 문제라 금방 풀었다!

0개의 댓글