본문 바로가기
알고리즘

프로그래머스 괄호 회전하기 (python, 파이썬)

by 블쭌 2021. 4. 20.
728x90
  • 문제

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

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

  • 코드
def solution(s):
    answer = 0
    dic = {'{':'}', '[':']', '(':')'}
           
    for i in range(len(s)):
        right = list(s[i:] + s[:i])
        left = []
        while right:
            temp = right.pop(0)
            if not left:
                left.append(temp)
            else:
                if left[-1] in ['}', ')', ']']:
                    break
                    
                if dic[left[-1]] == temp:
                    left.pop()
                else:
                    left.append(temp)
        
        if not left:
            answer += 1
            
    return answer

회전한 문자열을 right로 보고 비어있는 left 리스트를 생성하고

right에서 하나씩 뽑아서 left로 옮길때 

 

1) 비어있으면 그냥 추가해준다

2) 비어있지않다면 left의 값이 닫힌괄호이면 break로 반복문탈출

3) 비어있지않고 left의 값이 닫힌괄호가 아니라면 right의 맨 앞 문자열과 지울수있는지 dictionary를 통해 확인하고 지워준다. 

4) 비어있지않고 left의 값이 닫힌괄호가 아니라면 right의 맨 앞 문자열과 지울수없다면 left배열에 추가해준다.

 

최종적으로 left에 남아있지않다면 다 지운것이기 때문에 answer를 1추가해준다.


  • 출처

programmers.co.kr/learn/courses/30/lessons/76502

728x90

댓글