[백준] 9012번 - 괄호 | 파이썬

SangJin Ham·2023년 6월 20일
0

백준

목록 보기
9/51
post-thumbnail

9012번 - 괄호


문제

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

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


입력

출력은 표준 출력을 사용한다. 만일 입력 괄호 문자열이 올바른 괄호 문자열(VPS)이면 “YES”, 아니면 “NO”를 한 줄에 하나씩 차례대로 출력해야 한다.


출력

각 줄마다 해당 문자열이 균형을 이루고 있으면 "yes"를, 아니면 "no"를 출력한다.


예제 입력 1

6
(())())
(((()())()
(()())((()))
((()()(()))(((())))()
()()()()(()()())()
(()((())()(

예제 출력 1

NO
NO
YES
NO
YES
NO

코드

import sys

N = int(sys.stdin.readline().strip())

for i in range(N):
  stack = []

  line_ = sys.stdin.readline().strip()

  for char in line_:
    if char == '(':
      stack.append(char)

    elif char == ')':
      if len(stack) != 0 and stack[-1] == '(':
        stack.pop()
      else:
        stack.append(char)

  if len(stack) == 0:
    print('YES')
  else:
    print('NO')

풀이

이 문제의 경우 리스트를 이용한 스택 구조를 사용하면 쉽게 풀이할 수 있다.

먼저 N을 입력받는다.
그 후 (인지 물어보고 맞다면 stack 리스트에 append한다.
만약 )이라면 stack길이가 0이 아닌 즉, 이루어질 짝인 (이 있는지 확인하고, stack의 마지막 원소가 현재 char와 짝이 맞는 괄호라면 pop을 이용해 그 쌍을 삭제하고 아니라면 stack 리스트에 charappend한다.

그렇게 한 줄을 다 비교했을 때 stack 리스트가 비었다면 VPS를 의미하므로, YES를 출력하고 아니라면 NO를 출력한다.

profile
끄적끄적

0개의 댓글