iamkanguk.dev

[프로그래머스] LV2: 괄호 변환 본문

알고리즘(코딩테스트)/프로그래머스

[프로그래머스] LV2: 괄호 변환

iamkanguk 2024. 1. 10. 15:57

문제 링크

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

 

프로그래머스

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

programmers.co.kr

풀이

def isRight(p):   # 문자열 p가 올바른 괄호 문자열인지 확인하는 함수
    stack = []
    for i in p:
        if i == '(':
            stack.append(i)
        else:
            if not stack:
                return False
            stack.pop()
    return True if not stack else False

def splitToUAndV(p):   # 문자열 p를 u와 v로 분리 (u는 균형잡힌 괄호 문자열, v는 나머지)
    openBracketCount, closeBracketCount = 0, 0
    for idx, w in enumerate(p):
        if w == '(':
            openBracketCount += 1
        else:
            closeBracketCount += 1
        if openBracketCount == closeBracketCount:
            return p[:idx+1], p[idx+1:]

def solution(p):
    if not p:   # 1. 빈 문자열인 경우 그대로 빈 문자열 반환
        return p
    
    u, v = splitToUAndV(p)   # 2. 문자열을 u와 v로 분리
    
    if isRight(u) == True:   # 3. 문자열이 올바른 괄호 문자열이라면
        return u + solution(v)   # 3-1. v에 대해 1단계부터 다시 수행
    else:   # 4. 문자열 u가 올바른 괄호 문자열이 아닌 경우
        answer = '('   # 4-1. (를 붙임
        answer += solution(v)   # 4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 붙임
        answer += ')'   # 4-3. )를 붙임
        
        for i in u[1:len(u)-1]:   # 4-4. u의 첫번째와 마지막 문자를 제거하고 나머지 문자열의 괄호 방향 뒤집음
            if i == '(':
                answer += ')'
            else:
                answer += '('    
    return answer   # 4-5. 반환

풀이 해석

- 빈 문자열인 경우 바로 반환해준다.

- splitToUAndV 메서드로 문자열을 u와 v로 분리해준다.  필자는 반복문과 enumerate 메서드를 통해 (의 개수와 )의 개수를 세어가며 같을 경우에 바로 메서드를 끝냈다. 왜냐면 균형잡힌 문자열이기 때문이다.

- isRight 메서드를 통해 올바른 문자열인지 확인한다. isRight 메서드는 stack을 활용해서 확인을 해준다. 핵심은 ) 가 나오면 stack에 (가 있는지 확인하고 있으면 pop을 해주면 된다. 만약 (가 없는 상태에서 )가 온다면 올바른 괄호 문자열이 아니다.

- 올바른 문자열이면 v를 1단계부터 수행하라고 했으니까 solution 메서드를 그대로 재귀로 호출해준다.

- u가 올바른 문자열이 아니면 문제에 나와있는대로 천천히 따라하면 된다 (이건 쉬운듯^_^)

후기

개인적으로 문제가 어렵진 않았는데? 재귀쪽을 처리하는건 조금 힘들었던 것 같다.

한 80% 정도는 다 풀었는데 시간을 너무 쓰는거 같아서 다른분들의 풀이를 조금 참고해서 마무리를 지었다.