카테고리 없음

프로그래머스 lev2 : 괄호 변환

미소서식지 2022. 9. 28. 18:02

문제

https://school.programmers.co.kr/learn/courses/30/lessons/60058

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

처음에 잘못 푼 풀이

3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다. 
  3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다. 

이 부분을 수정해주자 되었다.

다시 1다계부터 수행해준다는 것은 solution(v)를 해주면 1단계부터 다시 수행하게 되고,

그 수행한 결과의 문자열은 solution(v)의 리턴값 그 자체이므로 반환해주는 리턴 값은 

return u + solution(v)로 해주면 된다.

 

def balanced(w): # 균형잡힌 괄호 문자열로 분리해주는 것
    i = 0
    cnt1, cnt2 = 0, 0
    while i < len(w):
        if w[i] == "(":
            cnt1 += 1
        else:
            cnt2 += 1
        if cnt1 == cnt2:
            break
        i += 1
    return (w[:i+1], w[i+1:]) # u와 v 반환

def right(u): # 올바른 괄호 문자열인지 판단
    stk = []
    for i in u:
        if i == '(':
            stk.append(i)
        else:
            if len(stk) > 0:
                stk.pop()
            else:
                return False
            
    if len(stk) > 0:
        return False
    else:
        return True

def solution(p):
    answer = ''
    if p == '':
        return ''
    
    u, v = balanced(p)
    
    if right(u):
        answer += u
        print(answer, '균형')
        solution(v)
    else:
        answer += "("
        tmp = solution(v)
        answer += tmp 
        answer += ")"

        t = u[1:-1]

        end = ''
        for i in t:
            if i == "(":
                end += ')'
            else:
                end += '('
        answer += end
        print(answer, end, '맞춤')
    
    return answer

 

풀이

def balanced(w): # 균형잡힌 괄호 문자열로 분리해주는 것
    i = 0
    cnt1, cnt2 = 0, 0
    while i < len(w):
        if w[i] == "(":
            cnt1 += 1
        else:
            cnt2 += 1
        if cnt1 == cnt2:
            break
        i += 1
    return (w[:i+1], w[i+1:]) # u와 v 반환

def right(u): # 올바른 괄호 문자열인지 판단
    stk = []
    for i in u:
        if i == '(':
            stk.append(i)
        else:
            if len(stk) > 0:
                stk.pop()
            else:
                return False
            
    if len(stk) > 0:
        return False
    else:
        return True

def solution(p):
    answer = ''
    if p == '':
        return ''
    
    u, v = balanced(p)
    
    if right(u):
        # answer += u
        # print(answer, '균형')
        # solution(v)
        return u + solution(v) # 이 부분 수정해줌
    else:
        answer += "("
        tmp = solution(v)
        answer += tmp 
        answer += ")"

        t = u[1:-1]

        end = ''
        for i in t:
            if i == "(":
                end += ')'
            else:
                end += '('
        answer += end
    
    return answer