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

이영재·2025년 3월 5일

알고리즘

목록 보기
4/4
post-thumbnail

문제 설명

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

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

입출력 예시 설명

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

풀이

문제 분석

  • 문자열 s를 s의 길이만큼 회전 시켜서 옳바른 괄호의 문자열의 개수를 구하는 문제
  • 옳바른 괄호란?
    • 괄호가 열렸으면 닫혀야함. 또한 괄호가 닫히지 않았는데 열릴 수 없다.
    • 괄호는 "()", "[]", "{}" 로 이뤄져있다.
  • 제한 사항
    • 문자열의 길이가 최대 1000이므로, O(N²) 정도의 시간 복잡도까지는 감당할 수 있음.

🤔 생각

  • 문자열 회전은 substring 으로 문자열 자르기
  • 괄호가 열렸으면 꼭 닫혀야 한다. stack 자료 구조 사용

구현

import java.util.Stack;

class Solution {
    public int solution(String s) {
        int answer = 0;
        int len = s.length();
        
        for (int i = 0; i < len; i++) { // i는 0부터 시작해야 한다.
            if (fn(s)) { // 올바른 괄호 문자열인지 체크
                answer++;
            }
            // 문자열 회전
            s = s.substring(1, len) + s.charAt(0);
        }
        return answer;
    }
    
    public static boolean fn(String str) {
        Stack<Character> stack = new Stack<>();
        
        for (char c : str.toCharArray()) {
            if (!stack.isEmpty()) {
                char top = stack.peek();
                
                if ((top == '{' && c == '}') || 
                    (top == '[' && c == ']') || 
                    (top == '(' && c == ')')) {
                    stack.pop();
                    continue;
                }
            }
            stack.push(c);
        }
        return stack.isEmpty();
    }
}
  • Stack을 이용하여 괄호 문자열을 검증하는 fn() 함수는 O(N)으로 구현

0개의 댓글