Haribo ML, AI, MATH, Algorithm

괄호 회전하기


pair = {')' : '(', '}' : '{', ']' : '['}
def check(s) :
    answer = 0
    stack = []
    for sign in s :
        if sign in '({[' : stack.append(sign)
        elif stack and stack[-1] == pair[sign] : stack.pop()
        else : return 0
        if not stack : answer += 1
    return 0 if stack else answer

def solution(s) :
    s = s+s
    for i in range((n := len(s)//2)) :
        if (answer := check(s[i:i+n])) == 0 : continue
        return answer
    return 0

풀이

사실 회전해가면서 셀필요없는 문제다.

괄호가 모두 올바르게 구성되어있다면 회전시켜가며 얻을 수 있는 올바른 괄호의 경우의 수는 올바른 괄호 덩어리 개수와 같다.

([{}]){()}() : ABC
()([{}]){()} : CAB
{()}()([{}]) : BCA

3가지

즉, 문제를 다시 정리하면

  • 괄호를 회전시키면 올바르게 나오는 경우가 존재하는가?
    • 존재한다면 덩어리 개수를 return
  • 올바른 경우가 안나오면 return 0

을 해주면된다.

pair = {')' : '(', '}' : '{', ']' : '['}
def check(s) :
    answer = 0
    stack = []
    for sign in s :
        # 열린 괄호는 무조건 stack에 append
        if sign in '({[' : stack.append(sign)
        # 이전 괄호와 짝이 맞다면 이전 괄호 pop
        elif stack and stack[-1] == pair[sign] : stack.pop()
        # 올바른 괄호가 없는 케이스 return 0
        else : return 0
        # stack이 empty면 덩어리하나가 완성되었다는 뜻
        if not stack : answer += 1
    return 0 if stack else answer

def solution(s) :
    s = s+s
    for i in range((n := len(s)//2)) :
        if (answer := check(s[i:i+n])) == 0 : continue
        return answer
    return 0

Similar Posts

이전 포스트 음양 더하기

다음 포스트 모두 0으로 만들기

Comments