괄호변환 파이썬

임규성·2023년 1월 25일
1
post-custom-banner

문제 설명

->링크<-

해결 방법

문제에서 설명해준 방법그대로 따라가면 되지만 재귀함수에대한 어느정도 친숙함이 있지않다면 결코 쉽게 이해하지 못했을 것이다. 따라서 이문제는 논리적으로 해결 방법을 찾아가기 보다

결국 이 문제의 핵심 해결 방법은 평소 재귀함수의 실력과 재귀적 사고실력을 기반으로 문제를 독해해 나가며 이해하고 그 이해를 기반으로 천천히 구현해가면 되는 문제였다!!!!!

해답 코드

def seperate(p,size):
    #최소한의 u랑 v로 나누기
    tmp = 0
    for i in range(size):
        if p[i] == ')':
            tmp -= 1
        elif p[i] == '(':
            tmp += 1
        #균형잡힌 문자열이 완성되었을 때 u랑 v로 나눠주기
        if tmp == 0:
            u = p[0:i+1]
            v = p[i+1:]
            break
    return u,v
#올바른 괄호인지 판단해주는 함수
def is_right(s):
    tmp = 0
    for c in s:
        if c == '(':
            tmp += 1
        elif c == ')':
            tmp -= 1
        if tmp < 0:
            return False
    return True
def solution(p):
    answer = ''
    #빈 문자열 이라면
    if p == '':
        return ''
    size = len(p)
    #최소한의 u랑 v로 나누기
    u, v = seperate(p,size)
    #u가 올바른 괄호면 answer에 붙여주기
    if is_right(u) == True:
        answer += u
        #v에대해 올바른 괄호 만들기
        answer += solution(v)
    #u가 올바른 괄호가 아니라면 다음 과정해주기
    else:
        #u를 올바른 괄호로 만들어 준 후 그u를 
        #1. 앞에 '('를 붙인다.
        answer += '('
        #2 v에 대해 sol함수 수행결과를 붙인다.
        answer +=solution(v)
        #3 뒤에 ')'를 붙인다.
        answer += ')'
        #4 u의 앞뒤를 자르고 뒤집어준 녀석을 붙여준다.
        u = u[1:len(u)-1]
        for c in u:
            if c == '(':
                answer += ')'
            elif c == ')':
                answer += '('
    return answer

걸린 시간

다른사람의 코드를 보고난 후

문제를 이해하고 그대로 구현하는 문제기 때문에 큰틀에서는 결국 나랑 같은 방법이다. 하지만 확실히 변수를 줄이고 단순화 한 코드가 훨씬 깔끔해보이고 좋은 코드였다.

파이썬에서 str에 append함수를 사용 못하는 이유?

처음에 str인 answer문자열에 append함수를 사용해서 문자열을 추가해가는 방식으로 했었는데 여기서 문법에러가났다!!!
이유를 찾아보니 immutable과 mutable의 차이를 알 수 있었다.
immutable한 변수나 값들은 바꾸는게 아니라 할당을 바꾸는 즉 바인딩을 바꾸면서(주소를 바꾸면서) 바뀌어야하고 mutable한 변수는 그안의 값을 직접 바꾸기 때문에(주소를 안 바꾸기 때문에) append함수를 사용할 수 있었다.

profile
삶의 질을 높여주는 개발자
post-custom-banner

0개의 댓글