Python/[프로그래머스]

[프로그래머스][Level 2] 괄호 회전하기(★)

hyunnn_00 2023. 7. 23. 16:03
문제 설명

 

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

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

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


 

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

 

입출력 예


입출력 예 설명

 


def check(s):
    op = '({['
    cl = ')}]'
    stack = []
    
    for elem in s:
        if elem in op: # 여는 괄호이면
            stack.append(elem)
        elif not stack or op.index(stack[-1]) != cl.index(elem): # 여는 괄호의 순서와 닫는 괄호의 순서가 같지 않으면
            return False
        else: # 올바르면
            stack.pop() # 여는 괄호 제거
    if len(stack) == 0: # 모두 올바르면
        return True # True 리턴


def solution(s):
    cnt = 0 # 개수 셀 변수
    for i in range(len(s)):
        if check(s):
            cnt += 1
        s = s[1:] + s[0]
    return cnt

 

풀이 설명

1. check 함수를 통해 올바른 괄호 문자열인지 확인

   check 함수 설명

- op 에 여는 괄호, cl 에 닫는 괄호 

- stack이라는 빈 배열 생성

 

s에 있는 원소에 대해 그 원소가 여는 괄호이면 stack 배열에 원소 추가

-> 바른 배열이려면 여는 원소가 먼저 와야하기 때문

그 외의 경우에 stack이 비어있다면 (닫는 괄호만 있다면) 혹은 op의 여는 괄호의 순서가 cl의 닫는 괄호의 순서와 같지 않다면 False 리턴

-> 가장 최근에 쌓은 문자열의 인덱스 번호와 같아야 함

 

그 외의 경우에는 올바르기 때문에 stack에서 해당 괄호 제거 

-> 비어있으면 True 리턴(모두 올바르기 때문)

 

2. solution 함수를 통해 회전시키면서 올바른 괄호의 개수 출력

- cnt 변수 0으로 초기화

- 각 문자열을 순회하면서 check 함수가 올바르면 cnt 변수를 1씩 증가시킴

-  s = s[1:] + s[0]을 통해 s를 회전시킴

- cnt 변수 리턴