[Python] 코딩 도장 - Simple Balanced Parentheses

Updated:

코딩 도장 사이트의 문제를 직접 풀어본 내용을 정리하여 올립니다.

코딩 도장에서 여러 문제를 확인할 수 있습니다.

난이도 순으로 차근차근 풀어보려 합니다.


[문제: Simple Balanced Parentheses] - Lv.2

아래는 괄호를 이용한 연산식이다.

(5+6)∗(7+8)/(4+3)

우리는 여는 괄호가 있으면 닫는 괄호가 반드시 있어야 한다는 것을 잘 알고 있다.

다음은 정상적인(balanced) 괄호 사용의 예이다.

(()()()())
(((())))
(()((())()))

다음은 비정상적인(not balanced) 괄호 사용의 예이다.

((((((())
()))
(()()(()
(()))(
())(()

괄호의 사용이 잘 되었는지 잘못 되었는지 판별 해 주는 프로그램을 작성하시오.

출처: https://codingdojang.com/scode/457?answer_mode=hide


[풀이]

def SimpleBalancedParentheses(a):
    b = [i for i in a if (i=="(") | (i==")")]
    
    if (b[0] == ")") | (b[-1] == "("):
        return print("not balanced")
    
    while b[0] != b[-1]:
        b.pop(b.index(b[0]))
        b.pop(b.index(b[-1]))

        if len(b) == 0:
            return print("balanced")
            break
            
    return print("not balanced")


SimpleBalancedParentheses("(5+6)∗(7+8)/(4+3)")
SimpleBalancedParentheses("(()()()())")
SimpleBalancedParentheses("(((())))")
SimpleBalancedParentheses("(()((())()))")

SimpleBalancedParentheses("((((((())")
SimpleBalancedParentheses("()))")
SimpleBalancedParentheses("(()()(()")
SimpleBalancedParentheses("(()))(")
SimpleBalancedParentheses("())(()")
SimpleBalancedParentheses(")()(")
balanced
balanced
balanced
balanced
not balanced
not balanced
not balanced
not balanced
not balanced
not balanced

만약 괄호 사용이 정상적이라면 어떤 형태이던 양 끝의 모양은 서로 다르다고 생각하였다.

이러한 경우 값을 제거하면서 결국 모든 값이 제거되면 정상이라고 판단하였다.

대신 “)()(“ 같은 경우를 위해 시작이 닫힘이거나 끝이 열림이면 비정상으로 판단하게 하였다.

만약 괄호의 수가 홀수이면 비정상이고 이는 while문의 혹시 끝까지 반복되어도 len(b)가 0이 될 수 없다.

[추천 풀이]

def isBalanced(s):
    n=0
    for i in range(len(s)):
        n += (1 if s[i]=='(' else -1)
        if n < 0:
            return False

    return True if n==0 else False

print(isBalanced('(()()()())'))
print(isBalanced('(((())))'))
print(isBalanced('(()((())()))'))
print(isBalanced('((((((())'))
print(isBalanced('()))'))
print(isBalanced('(()()(()'))
print(isBalanced('(()))('))
True
True
True
False
False
False
False

정말 간단하게 푸셨는데 “(“이면 1 아니면 -1로 합계를 구하는 방식을 사용했다.

for문의 if 조건으로 혹시 시작이 “)”인 것 등도 간단하게 잡아낸다.

Leave a comment