[프로그래머스] 괄호 변환 (Python 파이썬)

dh·2022년 12월 29일
0
post-thumbnail

https://school.programmers.co.kr/learn/courses/30/lessons/60058
문제를 이해하는데 시간이 많이 걸렸던것 같다.
특히 문제에서 "괄호방향을 뒤집어서" 라는 말을 잘못 이해했다.
문자의 순서바꾸기 XXX 괄호 모양 뒤집기 OOO
"))(()(" ➡ "()(())" (X)
"))(()(" ➡ "(())()" (O)
문자열을 거꾸로 뒤집으라는 뜻이 아닌 즉, ) ➡ ( , ( ➡ ) 로 뒤집으라는 의미였다.

코드

def solution(p):
    if p == '':
        return ''
	# 문자열 분리
    u,v = split_bracket(p)
    # u가 올바른 문자열인지 체크
    perfect = check_perfect(u)
	
    # 올바른 문자열일때
    if perfect:
    	# v에 대해 재귀 수행
        result = solution(v)
        answer = u+result
    # 올바른 문자열이 아닐때
    else:
    	# v에 대해 재귀 수행
        result = solution(v)
        result = '('+result +')'
        arr=list(u[1:-1])
		# ) ➡ ( , ( ➡ ) 로 뒤집기
        for i in range(len(arr)):
            if arr[i] == '(':
                arr[i] = ')'
            elif arr[i] == ')':
                arr[i] = '('
        u= ''.join(arr)
        answer = result+u

    return answer

# 올바른 괄호 문자열인지 체크
def check_perfect(u):
    stack = []
    if u[0] == ')':
        return False

    stack.append(u[0])
    for i in range(1,len(u)):
        if stack[-1] == u[i]:
            stack.append(u[i])
        else:
            stack.pop()

    if len(stack)>0:
        return False
    else:
        return True

# 균형잡힌 괄호 문자열로 나누기
def split_bracket(p):
    stack = []
    l_bracket = 0
    r_bracket = 0

    for i in p:
        if i == '(':
            l_bracket += 1
            stack.append(i)
        else:
            r_bracket += 1
            stack.append(i)

        if l_bracket == r_bracket:
            break
    return p[:len(stack)], p[len(stack):]

0개의 댓글