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 변수 리턴