프로그래머스 괄호 회전하기 코드 및 해설 (파이썬)

2021. 4. 26. 14:44algorithm

반응형

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

 

코딩테스트 연습 - 괄호 회전하기

 

programmers.co.kr

 

💡 stack을 이용해 올바른 괄호인지 아닌지 판단했습니다.

 

우선 소괄호, 중괄호, 대괄호가 섞여 있는 string을 입력으로 받아 올바른 괄호인지 아닌지 판단하는 is_correct 함수를 정의했습니다. 닫는 괄호를 key, 그에 상응하는 여는 괄호는 value로 갖는 parenthesis라는 딕셔너리를 만들고,

 

(1) input의 시작이 닫는 괄호면 바로 False를 반환하도록 했습니다.

 

(2) 그 외의 경우엔 stack을 만들어 input의 하나씩 받으면서

 

(2-1) 닫는 괄호고 stack에 pop할 것이 있는 경우, 현재의 닫는 괄호와 대응하는 여는 괄호가 stack의 마지막에 있으면 for loop를 이어가고, 아니면 바로 False를 반환하게 했습니다.

 

(2-2) 그 외에 여는 괄호거나 stack이 비어 있는 경우 현재 괄호를 stack에 append했습니다.
최종적으로 stack이 비어 있으면 True, 아니면 False를 반환하도록 했습니다.

solution 함수에선 0 ~ len(s) -1 까지 왼쪽으로 회전시키면서 is_correct에서 True를 반환한 경우 answer를 1씩 증가시키도록 했습니다.

 

 

def is_correct(s):
    parenthesis = {')':'(', '}':'{', ']':'['}
    
    # 첫 시작이 닫는 괄호면 False 
    if s[0] in parenthesis.keys():
        return False
    else:
        stack = []
        for element in s:
            # 닫는 괄호고 stack에 pop할 것이 있는 경우 
            if element in parenthesis.keys() and stack:
                if parenthesis[element] != stack.pop():
                    return False
            # 여는 괄호 또는 stack이 비어있는 경우 
            else:
                stack.append(element)
    # stack이 비어 있으면 True, 아니면 False 
    return True if not stack else False

def solution(s):
    answer = 0
    
    for i in range(len(s)):
        # 0 ~ len(s)-1 까지 회전시키기 
        if is_correct(s[i:] + s[:i]):
            answer += 1 

    return answer

 

반응형