본문 바로가기

알고리즘

[programmers] 괄호 변환

문제 설명

매개변수 설명

입출력 예


로직설명

1. 균형잡힌 괄호문자열, 올바른 괄호 문자열 확인하는 함수를 만들고

2. 1~4번까지 구현하기.. (다른 사람들은 차례대로 구현하면 되는 문제라 어렵지 않다고 하셨는데 난 어려웠다,,,)

 

코드

# 균형잡힌 괄호 문자열
def balance(p):
    cnt = 0
    for i in p:
        if i == '(':
            cnt += 1
        else:
            cnt -= 1

    if cnt == 0:
        return True
    return False

# 올바른 괄호문자열
def correct(p):
    left = 0
    right = 0

    for i in p:
        if i == '(':
            left += 1
        else:
            right += 1
        if right > left:
            return False
    if right == left:
        return True
    else:
        return False

def makeuv(p):
    u = ''
    v = ''
    for i in range(len(p)):
        if balance(p[:i+1]):
            u += p[:i+1]
            v += p[i+1:]
            break
    return u, v

def problem(p):
    # 1번
    if p == '':
        return ''

    # 2번
    u, v = makeuv(p)  # u=(()()) v=)(

    # 3번
    temp = ''
    if correct(u):  # 3-1에서 시간 많이 걸림,,
        u += problem(v)
        return u

    # 4번
    else:
        # temp += '(' + problem(v) + ')' + u[1:-1][::-1]
        temp += '(' + problem(v) + ')'  # ')' -> '(' 와 '(' -> ')' 로 변환하라는 뜻
        uu = u[1:-1]
        for i in uu:
            if i == '(':
                temp += ')'
            else:
                temp += '('
        '''
        p = "()))((()" 일때, temp = (())()로 잘 나오는데,
        맨 처음 기존의 u+temp가 되어야 정답인데
        '''
        return temp

def solution(p):
    if correct(p):
        return p
    else:
        res = problem(p)
        return res

 

주의해야하는 부분

1. 4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다. 

      => ')' -> '(' '(' -> ')' 로 변환하라는 뜻

      => u[1:-1][::-1] 이렇게 하니까 테케 12~ 거의 마지막 테케 전인가?까지 에러났다.

2.  p = "()))((()" 일때, temp = (())()로 잘 나오는데, 정답은 맨 처음 기존의 u+temp가 되어야 하는데, 답이 자꾸 ((())())이렇게 나왔다..

      => 용어정리부분에서 1,2,3,4번이 있는데, u=(), v=))((()이면 3번으로가서 v에 대해서 처음부터 진행한다.

      => v가 다시 u=))(( v=()로 나뉘는데 이때 u가 올바른 괄호문자열이 아니라서 4번을 가야한다

      => 그리고나서 다시 3번으로 가서 ()[기존에 수행한 결과] + temp를 반환

   * 문제점 : 마지막 =>에서 3번으로 가야하는데 4번으로 감 -> correct함수가 이상하게 되어있었음

 

 

'알고리즘' 카테고리의 다른 글

[baekjoon] 7576. 토마토  (0) 2020.06.29
[programmers] 크레인 인형뽑기 게임  (0) 2020.06.27
[baekjoon] 2468. 안전 영역  (0) 2020.06.25
[baekjoon] 2667. 단지 내 수 세기  (0) 2020.06.25
[programmers] 문자열 압축  (0) 2020.06.24