728x90

[문제 설명]

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

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

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

 

[입출력 예]

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

 

[차근 차근 생각해보기]

  1. s를 이어 붙여서 회전한 모습을 만든다.
  2. isCorrect 함수를 만들어 온전한 괄호인지 판별한다.
    • 열린 괄호일 경우 stack에 넣어준다.
    • 닫힌 괄호이고 stack에 들어간 괄호와 짝이 맞을 경우 stack에 있는 괄호는 빼준다.
    • 만약 닫힌 괄호가 열린 괄호보다 먼저 들어갈 경우 return false를 해준다.
  3. isCorrect 함수에서 true일 경우 answer에 1을 더해주고 return 해준다.

 

[코드]

import java.util.*;
class Solution {
    public int solution(String s) {
        int answer = 0;
        
        String newStr = s + s;
        for(int i = 0; i < s.length(); i++){
            if(isCorrect(newStr.substring(i, s.length() + i))){
                answer += 1;
            }
        }
        
        return answer;
    }
    
    boolean isCorrect(String s){
        String[] str = s.split("");
        Stack<String> stack = new Stack<>();
        
        for(int i = 0; i < str.length; i++){
            if(str[i].equals("(") || str[i].equals("[") || str[i].equals("{")){
                stack.push(str[i]);
            }else if(stack.empty()){
                return false;
            }else if(str[i].equals(")") && stack.peek().equals("(")){
                stack.pop();
            }else if(str[i].equals("]") && stack.peek().equals("[")){
                stack.pop();
            }else if(str[i].equals("}") && stack.peek().equals("{")){
                stack.pop();
            }
        }
        
        if(stack.empty()){
            return true;
        }
        
        return false;
    }
}

 

[반성할 점]

괄호 문제는 스택으로 푸는 문제이다.

회전을 위해 문자열 s를 한번 더 더한다는 아이디어가 정말 흥미로웠다.

아이디어를 주신분께선 경험의 차이라는데 과연 경험의 차이가 맞을까 의심된다..

 

아직까지 생각하는 코드를 구현해내는 것이 많이 부족하다.

알고리즘 이외에도 다른 문제를 풀면서 구현력을 기르도록 노력해야겠다.

728x90

+ Recent posts