영아일지

[프로그래머스 level-2] 괄호 변환 본문

디지털/코딩테스트

[프로그래머스 level-2] 괄호 변환

영아일지 2023. 6. 22. 04:09

코딩테스트 연습 - 괄호 변환 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

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

programmers.co.kr

 

[내 풀이]

1) 문자열이 빈 문자열이면 그대로 리턴

2) 문자열 w를 u,v 로 나누기 

    이때, u는 균형잡힌 문자열이므로 '(' 수와 ')' 수가 같으면 u라고 두고 나머지는 v라고 둔다.

3) u가 올바른 괄호 문자열인지 확인하는 right 함수를 만든다

    u를 하나 씩 대입하며 '(' 인 경우 stk에 넣고, stk이 비어 있지 않으면서 ')'인 경우는 stk에서 '(' 를 제거한다 

    만약 stk이 비어있는 상태에서 '('이 나오거나 아니면 마지막까지 u값이 왔음에도 불구하고 stk에 문자열이 남아있다면 

     false, 아니면 true이다.

3-1) 문자열 u가 올바른 괄호 문자열이라면 u값과 v값을 재귀한 후의 값을 문자열로 둔다

여기서 어떤 걸 return해야할지 헷갈려서 오래 걸림

4) 문자열  u가 올바른 괄호 문자열이 아니라면 처리를 해준다

** 여기서 유념할 점은 문자열은 거꾸로 하는 것이 아니라 방향을 전환한다는 것이다!

def solution(p):
    return check(p, '')
def right(u):
    # 3번 : u가 올바른 괄호 문자열인지 확인
    stk = []
    for j in range(len(u)):
        if u[j] == '(':
            stk.append('(')
        else:
            if stk:
                stk.pop()
            else:
                return False
    if stk != []:
        return False
    return True
def check(w, ans):
    #1번 : 빈 문자열
    if w == '':
        return ''

    #2번 : u,v 분리
    u, v = '', ''
    dic = {'(': 0, ')': 0}
    for i in range(len(w)):
        dic[w[i]] += 1
        u += w[i]
        if dic['('] == dic[')']:
            break
    if i != len(w)-1:
        v = w[i+1:]

    res = right(u)

    #3-1번
    if res is True:
        return u+check(v, ans+u)

    #4번
    else:
        word = '(' + check(v, ans+u) + ')'
        for j in range(1, len(u)-1):
            if u[j] == '(':
                word += ')'
            else:
                word += '('
        return word