Algorithm/백준

[BAEKJOON] 9012번: 괄호

NegotiationMan 2023. 8. 22. 19:54

문제

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고 부른다. 한 쌍의 괄호 기호로 된 “( )” 문자열은 기본 VPS 이라고 부른다. 만일 x 가 VPS 라면 이것을 하나의 괄호에 넣은 새로운 문자열 “(x)”도 VPS 가 된다. 그리고 두 VPS x 와 y를 접합(concatenation)시킨 새로운 문자열 xy도 VPS 가 된다. 예를 들어 “(())()”와 “((()))” 는 VPS 이지만 “(()(”, “(())()))” , 그리고 “(()” 는 모두 VPS 가 아닌 문자열이다. 

여러분은 입력으로 주어진 괄호 문자열이 VPS 인지 아닌지를 판단해서 결과를 YES 와 NO 로 나타내어야 한다

 

코드

import sys
input = sys.stdin.readline

n = int(input())
for i in range(n):
    str_ = input().rstrip()
    stack = []
    for s in str_:
        if s == '(':
            stack.append('(')
        else: # ')'일 때
            if stack:
                stack.pop()
            else: # 빈 리스트일 때 pop()을 하면 error
                stack.append(')')
                break
    print("YES" if len(stack)==0 else "NO")

 

나의 생각

리스트가 비어있을  pop() 메서드를 호출하면 IndexError 발생하는데, 이를 방지하기 위해서는 리스트가 비어있는지 먼저 확인하고 pop() 호출해야 한다.

그래서 나는 ')'를 추가하여 len(stack)이 0이 되지 않도록 만들어 줬다.

그런데 for-else 문을 사용하면 가독성이 더 좋아질 것 같다. - >

for문에서 한 번도 break가 난적이 없다면 else문을 실행을 한다.

for element in sequence:
    # 반복 수행할 코드
    if condition:
        break
else:
    # 반복 완료 후 수행할 코드