괄호 회전하기

프로그래머스
이 문제는 괄호짝 검사 + 리스트 회전이 합쳐진 평범한 문제인데 대박적인것을 알아내었다.

나만 몰랐던 것 같긴 한데..ㅎㅎ


def check(k):
    stack = []
    for i in range(len(k)):
        if k[i]=='[' or k[i]=='(' or k[i]=='{':
            stack.append(k[i])
        elif k[i]==']':
            if (len(stack) == 0) or (stack and stack.pop()!='['):
                return False
        elif k[i]==')':
            if (len(stack) == 0) or (stack and stack.pop()!='('):
                return False
        elif k[i]=='}':
            if (len(stack) == 0) or (stack and stack.pop()!='{'):
                return False
    if stack:
        return False
    
    return True
        
            
def solution(s):
    cnt = 0
    s = list(s)
    for i in range(len(s)):
        s.append(s.pop(0))
        if check(s):
            cnt += 1   
    return cnt

우선 나는 이렇게 문자열 s를 리스트화 시켜서 첫번째 원소를 pop하고 리스트 뒤에 붙여주고 check함수를 통해 괄호짝이 잘 맞는지를 검사하도록 코드를 작성하였다.

그러나 deque에는 rotate라는 메소드가 있었고,
deque.rotate(파라미터) 로 사용하는데 파라미터 값이 음수이면 왼쪽으로 회전, 양수이면 오른쪽으로 회전한다.
만약 한번 회전이 아니라 여러번 회전이면 rotate메소드가 정말 유용할 것 같다!

from collections import deque

def check(k):
    stack = []
    for i in range(len(k)):
        if k[i]=='[' or k[i]=='(' or k[i]=='{':
            stack.append(k[i])
        elif k[i]==']':
            if (len(stack) == 0) or (stack and stack.pop()!='['):
                return False
        elif k[i]==')':
            if (len(stack) == 0) or (stack and stack.pop()!='('):
                return False
        elif k[i]=='}':
            if (len(stack) == 0) or (stack and stack.pop()!='{'):
                return False
    if stack:
        return False
    
    return True
        
            
def solution(s):
    cnt = 0
    s = deque(s)

    for i in range(len(s)):
        s.rotate(-1)
        if check(s):
            cnt += 1
            
    return cnt

deque은 popleft, appendleft만 알았는데 rotate도 있었다니.. 새로운 것을 알게 되어서 뒤통수 맞은 것 같기도 하고 기분이 좋기도 하고..그렇다.😅

아 그리고 문자열은 pop, append를 지원하지 않으니 꼭 리스트나 덱 자료형으로 바꾸는 것 주의!

좋은 웹페이지 즐겨찾기