daniel7481의 개발일지

[프로그래머스]괄호 변환(level2) 본문

프로그래머스

[프로그래머스]괄호 변환(level2)

daniel7481 2022. 7. 19. 15:51
반응형

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

 

프로그래머스

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

programmers.co.kr

풀이

카카오 2020 블라인드 채용 문제 중 하나이다. 레벨2와 레벨3를 중심적으로 보고 있는데, 난이도가 꽤 있어서 쉽지 않다. 이 문제는 재귀 문제였는데, solution 함수 자체를 재귀하는 것은 처음이어서 조금 당황하기는 했다. 문제에서 친절하게 올바른 괄호를 만드는 법을 알려주었기에, 그대로 구현하면 된다. 간단히 매커니즘을 얘기하자면 한 문자열 p에 대하여 이 문자열이 올바른 괄호 문자열인지를 판별하는 verify함수와, u, v로 나눠주는 함수 seperate을 선언하고 구현하였다. 그 다음 u, v에 대하여 만약 u가 올바른 문자열이면 v를 패러미터로 재귀를 해주면 되고, 만약 올바르지 않다면 설명에 나온대로 (를 붙이고 v에 대하여 solution함수를 재귀한 값을 더해주고 )로 닫아준 후, u에 남은 값의 앞 뒤를 빼주고 괄호의 반대를 넣어주면 된다. 이게 어떻게 올바른 괄호를 만드는지는 모르겠지만, 설명한대로 구현했더니 문제 없이 작동한다.

def verify(s):
    stack = []
    for i in range(len(s)):
        if s[i] == '(':
            stack.append(1)
        else:
            if not stack:
                return False
            stack.pop()
    if stack:
        return False
    else:
        return True

def seperate(s):
    opening = 0
    closing= 0
    u, v = '', ''
    if s[0] == '(':
        opening += 1
    else:
        closing += 1
    u += s[0]
    for i in range(1, len(s)):
        if s[i] =='(':
            opening += 1
        else:
            closing += 1
        u += s[i]
        if opening == closing:
            if i != len(s)-1:
                v = s[i+1:]
            return u, v
def solution(p):
    answer = ''
    if not p:
        return p
    u, v = seperate(p)
    #print(u, v, verify(u))
    if verify(p):
        return p
    if verify(u):
        answer += u
        if not verify(v):
            answer += solution(v)
    else:
        answer += '('
        v = solution(v)
        answer += v
        answer += ')'
        u = u[1:-1]
        for i in range(len(u)):
            if u[i] == '(':
                answer += ')'
            else:
                answer += '('
    return answer
반응형