IT/코딩테스트

[IT/코딩테스트] KB ITYL 중간평가 대비 : 괄호 회전하기 (programmers)

토끼개발자 조르디 2025. 5. 29. 17:02

 

▶ 문제설명

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

⦁  (), [], {} 는 모두 올바른 괄호 문자열입니다.

⦁  만약 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

 

▶ 입출력 예 설명

입출력 예 #1
다음 표는 "[](){}" 를 회전시킨 모습을 나타낸 것입니다.

x s를 왼쪽으로 x칸만큼 회전 올바른 괄호 문자열?
0 "[](){}" O
1 "](){}[" X
2 "(){}[]" O
3 "){}[](" X
4 "{}[]()" O
5 "}[](){" X

 

올바른 괄호 문자열이 되는 x가 3개이므로, 3을 return 해야 합니다.

 


입출력 예 #2

다음 표는 "}]()[{" 를 회전시킨 모습을 나타낸 것입니다.

x s를 왼쪽으로 x칸만큼 회전 올바른 괄호 문자열?
0 "}]()[{" X
1 "]()[{}" X
2 "()[{}]" O
3 ")[{}](" X
4 "[{}]()" O
5 "{}]()[" X

 

올바른 괄호 문자열이 되는 x가 2개이므로, 2를 return 해야 합니다.


문제 정리

  • 문제 유형: 스택 + 시뮬레이션
  • 풀이 로직 요약:
    1. 문자열을 한 칸씩 회전해서 n개의 회전 경우 생성
    2. 회전된 문자열마다 괄호가 유효한지 스택으로 검사
    3. 유효한 경우 카운트 증가
    4. 최종 카운트 반환
  • 깨달은 점 / 핵심:
    • 괄호 짝 확인은 무조건 스택
    • 회전은 s + s로 처리하면 범위 잘리거나 슬라이싱 문제 없이 쉽게 구현 가능

 


솔루션 코드

def solution(s):
    from collections import deque

    def is_valid(string):
        stack = deque()
        for char in string:
            if char in "({[":
                stack.append(char)
            else:
                if not stack:
                    return False
                top = stack.pop()
                if (top == '(' and char != ')') or \
                   (top == '{' and char != '}') or \
                   (top == '[' and char != ']'):
                    return False
        return not stack  # 스택이 비어 있어야 유효

    answer = 0
    n = len(s)
    double_s = s + s  # 회전 고려용

    for i in range(n):
        rotated = double_s[i:i + n]
        if is_valid(rotated):
            answer += 1

    return answer