Algorithm

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

비번변경 2023. 10. 16. 17:49

문제

문제 : https://school.programmers.co.kr/learn/courses/30/lessons/76502

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

  • (), [], {}는 올바른 괄호다.
  • A가 올바른 괄호면 (A), [A], {A}도 올바른 괄호다. []가 올바른 괄호 문자열이므로, ([])도 올바른 괄호다.
  • A, B가 올바른 괄호면 AB도 올바른 괄호다. {}와 ([])가 올바른 괄호이므로, {}([]) 도 올바른 괄호다.

대괄호, 중괄호, 소괄호로 이루어진 문자열 s가 매개변수로 주어질 때, s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 반환하라.

 

 

풀이

매개변수 s의 길이가 1000 이하로 제한되어 있어, 직접 회전시켜서 괄호가 올바른지 확인했다. 괄호가 올바른지 확인하는 것은 이전에 해결했던 2023.06.29 - [프로그래머스] 올바른 괄호를 참고하여 stack을 이용했다.

 

1. 괄호가 올바른지 확인하는 함수를 정의한다.

매개변수로 괄호 문자열을 입력받는다. 문자열을 탐색해, stack에 가장 저장된 괄호가 열려 있고, 현재 괄호가 짝이 맞는 닫는 괄호면 stack에 저장된 괄호를 삭제한다. 그 외의 경우는 전부 괄호를 stack에 저장한다.

문자열 탐색이 끝나면 stack이 비어있는지 확인하여, 비어 있으면 올바른 괄호라는 의미로 True를 반환한다.

def check(bracket):
    stack = []
    for b in bracket:
        if stack:
            if b == ')' and stack[-1] == '(':
                stack.pop()
            elif b == '}' and stack[-1] == '{':
                stack.pop()
            elif b == ']' and stack[-1] == '[':
                stack.pop()
            else:
                stack.append(b)
        else:
            stack.append(b)
    return not stack

 

2. 매개변수 괄호 문자열 s를 회전시키면서 올바른 괄호인지 확인한다.

문자열 s를 회전시킬 때는 문자열을 2번 반복한 뒤 문자열 길이만큼 슬라이싱 했다.

def solution(s):
    answer = 0
    len_s = len(s)
    s += s

    for i in range(len_s):
        tmp = s[i:i+len_s]
        if check(tmp):
            answer += 1
    return answer

 

 

참고 문서

https://school.programmers.co.kr/learn/courses/30/lessons/76502