파이썬 문제풀이/구현

[프로그래머스 파이썬] 괄호 변환

ari0930 2024. 4. 8. 22:38

문제

(,)으로만 이루어진 문자열이 있다  ( 와 ) 의 개수가 같다면 이를 균형잡힌 괄호 문자열이라고 한다.

(,) 괄호 짝이 모두 맞을 경우에는 올바른 괄호 문자열이라고 부른다.

(()))(  균현잡힌 괄호 문자열 이지만 올바른 괄호 문자열은 아니다.

아래의 규칙을 이용하여 주어진 괄호 문자열을 올바른 괄호 문자열로 바꾸어 결과값을 return 하여라.

1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다. 
2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다. 
3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다. 
  3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다. 
4. 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다. 
  4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다. 
  4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다. 
  4-3. ')'를 다시 붙입니다. 
  4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다. 
  4-5. 생성된 문자열을 반환합니다.

입출력

풀이

일단 나는 u,v를 구분하기 위해서  u_value 라는 함수를 만들었다.

현재 주어진 문자열을 돌아서 균현잡힌 괄호 문자가 되는 순간 문자열을 현재 인덱스 기준으로

u,v로 나누고 반복문을 종료한다.

그후 이제  위의 규칙 3,4를 실행하기 위한 함수 u_result를 실행하도록 하였다 

u_result는 올바른 괄호 문자열을 판단하여 올바른 괄호 문자열이면 3번 규칙을 아니면 4번 규칙을 돌게 만들었다.

이때 올바른 괄호 문자열을 판단하기위해 (가 나올때 +1 , ) 이 나올때는 -1을 해주었으며

)은 값이 0보다 크지 않을때 나오거나 (가  0미만에서 나올경우 올바른 괄호 문자가 아니라고 판단하였다..

 

올바른 괄호 문자일경우 현재 u부분을 정답에 그래도 문자열을 더하고 v부분을 다시 u_value로 돌려서 u,v로 다시 위 과정을 반복한다.

 

올바른 괄호 문자열이 아닌경우에는 정답 문자열에 (을 더하고 v부분을  다시 u_value로 돌려서 u,v로 다시 위 과정을 반복 정답 문자열에 더하고 끝나면 )을 더한다 그리고 그후 u 문자열의 첫번째와 마지막 문자열의 제외한 나머지 문자열의 괄호들을 뒤집어서 뒤에 붙인다.

 

 

 

코드

answer = ""  # 초기화
def solution(p):
    global answer
    
    u_value(p)
    return answer

def u_value(array): #u,v 구분하기 
    global answer
    if array == "":
        return
    count1 = 0
    count2 = 0
    ustr = ""
    vstr = ""
    for i in range(len(array)):
        if array[i] == '(':
            count1 += 1
        if array[i] == ')':
            count2 += 1
        if count1 == count2: #균형잡힌 괄호 문자열이 될경우
            ustr = array[:i+1]
            vstr = array[i+1:]
            break  # 루프 종료

    u_result(ustr, vstr) #3,4번 실행을 위해

def u_result(array, varray):
    global answer
    value = 0
    check = True
    for i in array:
        if i == '(' and value >= 0:
            value += 1
        elif i == ')' and value > 0:
            value -= 1
        else:
            check = False #올바른 괄호 문자가 아니다
            break
    if check: #올바른 괄호 문자라면
        answer += array #현재 답에서 u 부분의 문자열을 그대로 더한다
        u_value(varray) #v에 대해서는 다시 1단계부터 시작한다 

    else: #올바른 괄호 문자가 아니라면

        answer += "(" # 첫부분 하고 끝부분을 ( v )로 감싸준다 
        u_value(varray) # v부분에 대해서 다시 1단계 부터 시작
        answer += ")"

        for i in range(1,len(array)-1): # 남은 u 부분에 대해서 괄호 방향 뒤집고 뒤에 붙이기
            if array[i]=='(':
                answer+=')'

                
            if array[i]==')':
                answer+='('

결과

카카오 코테여서 그런가 2단계인데도 시간이 제법 걸렸다.

 

반응형