본문 바로가기
코딩테스트/코딩테스트 문제

코딩테스트 준비 - 프로그래머스: 괄호 변환 풀이/재귀함수 문제 (파이썬)

by 공부가싫다가도좋아 2021. 7. 1.
반응형

프로그래머스: 괄호 변환

 


*프로그래머스 래벨이 올라갈수록 구현하기 귀찮은 문제들이 많은것 같네요 ㅠㅠ

 

문제풀러가기

https://programmers.co.kr/learn/courses/30/lessons/60058?language=python3 

 

코딩테스트 연습 - 괄호 변환

카카오에 신입 개발자로 입사한 "콘"은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를

programmers.co.kr


문제 분석

이 문제는 문제를 잘 읽고, 문제대로 따라서 코드를 작성하면 됩니다.


코드

def correct(p):
    string = ""
    for i in p:
        if len(string)==0:
            string += i
            continue
        if string[-1]=="(" and i==")":
            string=string[:-1]
        else:
            string+=i
    if len(string)==0:
        return True
    return False


def balanced(p):
    num=0
    string_b=""
    
    for i in p:
        if i=="(":
            num+=1
        else:
            num-=1
        string_b+=i
        if num==0:
            return len(string_b)

        
def change(p):
    string=""
    for i in p:
        if i =="(":
            string+=")"
        else:
            string+="("
    return string


def solution(p):
    if correct(p): return p
    u,v = p[:balanced(p)],p[balanced(p):]
    
    if correct(u):
        result = u+solution(v)
    else:
        result=""
        result="("+solution(v)+")"+change(u)[1:-1]
    return result

코드 풀이

# <<correct(p)함수>>
#p가 올바른 괄호 문자열인지 확인하는 함수
#p에서 "("와 ")"가 올바르게 있을 경우, 
# 올바른 괄호 쌍이 사라짐. 올바르지 않은 괄호 쌍은 남아있음.
# 문제에서, "1.입력이 빈 문자열인 경우, 빈 문자열을 반환합니다."
# len(string)==0 일때 return True이므로 빈 문자열은 빈문자열 그대로 반환해줌.
def correct(p): 
    string = ""
    for i in p:
        if len(string)==0:
            string += i
            continue
        if string[-1]=="(" and i==")":
            string=string[:-1]
        else:
            string+=i
    if len(string)==0:
        return True
    return False

#<<balanced(p)함수>>
#p가 균형잡힌 문자열인지 확인하며,
#균형 잡힌 부분까지의 인덱스를 반환해주는 함수
#문제에서 "2.문자열 w를 두 '균형잡힌 괄호 문자열' u, v로 분리합니다."
#u,v로 나눠 주기 위해 균형잡힌 문자열 까지의 길이를 반환해준다. 
def balanced(p): 
    num=0
    string_b=""
    
    for i in p:
        if i=="(":
            num+=1
        else:
            num-=1
        string_b+=i
        if num==0:
            return len(string_b)

#<<change(p) 함수>>
#p의 괄호를 반대로 바꿔주는 함수     
#문제에서 "4-4 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다. "
def change(p):
    string=""
    for i in p:
        if i =="(":
            string+=")"
        else:
            string+="("
    return string

#메인 실행 함수
def solution(p):
    if correct(p): return p  #p가 올바른 문자열 일때 p를 반환
    u,v = p[:balanced(p)],p[balanced(p):] #balanced함수를 통해 균형 잡힌 부분까지의 인덱스를 나눔
    
    #u가 올바른 문자열일 경우, v를 재귀함수로 돌려주면
    #v가 올바른 문자열이 될 때, result값을 반환함
    if correct(u): 
        result = u+solution(v)
    
    #u가 올바른 문자열이 아닐 경우, 
    else:
        result=""
        #문제에서 "4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다." -> "("
        #"4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다." ->solution(v)
        #"4-3. ')'를 다시 붙입니다." ->")"
        #"4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다."
        #->change(u)[1:-1]
        
        result="("+solution(v)+")"+change(u)[1:-1]
    return result

 

반응형

댓글