본문 바로가기

Algorithm

[프로그래머스] 코딩테스트 연습 - 괄호 회전하기(Python)

코딩테스트 연습 - 괄호 회전하기 [월간 코드 챌린지 시즌2]

풀이

제 풀이과정에서 중요했던 점은 stack이었습니다. 괄호의 종류가 다르니 괄호 별로 비교를 해주기 위해서 stack을 사용했습니다.

정석적인 풀이와 다른점이 있다면 if문을 많이 쓰기 싫어서 괄호에 해당하는 숫자를 정하고 숫자를 stack에 넣은 점이 있겠네요ㅎㅎ..

 

Code

def solution(s):
    answer, rotate = 0, len(s)
    for d in range(rotate):
        parenthesis, stack, total = s[d:]+s[:d], [], 0
        for i, pt in enumerate(parenthesis):
            if pt in ['[', '{', '(']:
                idx = ['[', '{', '('].index(pt)
                stack.append(idx)
                total += 1
            else:
                idx = [']', '}', ')'].index(pt)
                if not stack or stack.pop() != idx:break
                total -= 1
            if i == rotate-1 and total == 0:
                answer += 1
    return answer

 

문제 설명

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

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