문제 풀이

[백준] 9012번: 괄호 - Python(파이썬)

auyeol 2024. 2. 25. 12:21
728x90

 

문제

 

https://www.acmicpc.net/problem/9012

 

9012번: 괄호

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고

www.acmicpc.net

 

 

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열

 

괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)

 

 “(())()”와 “((()))” 는 VPS 이지만 “(()(”, “(())()))” , 그리고 “(()” 는 모두 VPS 가 아닌 문자열이다. 

 

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

 

------------------------------------------------------------------------------------------------------------------

 

풀이

import sys
def is_valid(s):    # 입력한 괄호 리스트를 매개변수로 하는 함수

    # (여는 괄호 - 닫힌 괄호) 쌍이므로 올바른 경우는 짝수
    # 짝수가 아닌 경우에 'NO'를 출력한 뒤, 함수 종료
    if len(s) % 2 != 0:
        print('NO')
        return

    ST = []     # 빈 스택 생성

    for c in s:
        if c == '(':  # 문자가 여는 괄호면 스택에 append
            ST.append(c)
        else:  # 닫는 괄호면 스택에서 pop()
            if len(ST) == 0:    # 닫는 괄호가 나왔는데 여는 괄호가 없는 경우 'NO'
                print('NO')
                return
            ST.pop()

    if len(ST) != 0:    # 반복문 이후, 스택이 비어있지 않은 경우 남은 괄호가 존재한다는 것이므로
        print('NO')     # 'NO'
        return
    print('YES')        # 스택이 비어있는 경우 정상 'YES'
    return


T = int(sys.stdin.readline())    # 입력 데이터의 수를 나타내는 정수 T가 주어진다

for _ in range(T):
    s = list(sys.stdin.readline().strip())  # 문자열을 입력받은 뒤, 리스트로 변환
    is_valid(s)

 

728x90