728x90

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

 

코딩테스트 연습 - 괄호 변환

카카오에 신입 개발자로 입사한 "콘"은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를

programmers.co.kr

출처 : 프로그래머스


# 데브매칭
# w를 두 "균형잡힌 괄호 문자열" u, v 로 분리하는 함수
def divided(w):
    w_sum = 0
    for i in range(len(w)):
        if w[i] == '(':
            w_sum += 1
        elif w[i] == ')':
            w_sum -= 1
        if w_sum == 0:  # 균형잡힌 괄호 문자열
            return w[:i + 1], w[i+1:]


# "올바른 괄호 문자열" 체크 함수
def check(arr):
    stack = []
    for i in arr:
        if i == "(":
            stack.append(i)  # 스택 삽입
        elif i == ")":  # 스택 pop( 짝 맞추기 비교)
            if not stack:  # 스택 비어있으면 안맞는거임
                return False
            stack.pop()
    return True


def solution(p):
    if p == "":
        return p
    u, v = divided(p)
    # print(u,v)
    
    if check(u):  # 올바른 괄호 문자열이라면
        return u + solution(v)

    else:  # 올바른 괄호 문자열이 아니라면
        answer = "("
        answer += solution(v)
        answer += ")"

        # tmp = u[1:len(u)-1]
        # answer += tmp[::-1]
        for i in range(1,len(u)-1):
            if u[i] == "(":
                answer += ")"
            else:
                answer += "("
        
        return answer

풀이

문제가 길어서 빡구현하는데 헷갈렸다.

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

이 규칙에서 뒤집는거를 문자열을 아예 뒤집는 것으로 잘못 이해해서 계속 오류가 났다.

괄호 방향을 뒤집는 것이었다^^...

문제가 길수록 빨리 이해하고 빠르게 구현하는 법을 익히자.

 

 

"올바른 괄호"를 구별하는 함수를 stack으로 구현했다.

개수가 아닌 짝을 맞춰야 하니까 

"("  가 들어오면 stack에 넣고 " )"가 들어오면 빼서 짝수가 맞는지 확인한다.

이때, stack이 비어있으면, 다시 말해서 pop을 더 이상 할 수 없으면 False 다

짝이 맞지 않는 것이다.

+ Recent posts