[백준 4949] 균형잡힌 세상

문제

세상은 균형을 이루어야 합니다. 양과 음, 밝음과 어두움, 왼쪽과 오른쪽 괄호처럼.

정민의 과제는 문자열이 주어지면 괄호의 균형이 잘 맞는지 판단하는 프로그램을 작성하는 것입니다.

문자열에는 대괄호(“()”)와 대괄호(“()”) 두 종류가 있으며 문자열 균형을 맞추기 위한 조건은 다음과 같습니다.

  • 각 왼쪽 괄호(“(“)는 하나의 오른쪽 괄호(“”)와만 일치해야 합니다.
  • 각 왼쪽 대괄호(“(“)는 오른쪽 대괄호(“”)와만 일치해야 합니다.
  • 모든 오른쪽 괄호에는 일치하는 왼쪽 괄호가 있습니다.
  • 모든 대괄호 쌍은 1:1로만 할당할 수 있습니다. 즉, 괄호는 둘 이상의 괄호와 쌍을 이룰 수 없습니다.
  • 괄호 쌍이 두 개인 경우 그 사이의 문자열도 균형을 이루어야 합니다.

정민이가 주어진 현이 균형 잡힌 현인지 아닌지 판단하도록 도와줍시다.

기입

각 문자열은 마지막 문자를 제외한 영문자, 공백, 대괄호(“( )”), 대괄호(“( )”)로 구성되며 마침표(“.”)로 끝나며 길이는 이하 또는 100자에 해당합니다.

마침표(“.”)는 입력 종료 조건으로 끝에 입력됩니다.

누르다

각 행에 대해 해당 문자열이 균형을 이루면 “yes”를 반환하고 그렇지 않으면 “no”를 반환합니다.


설명

from sys import stdin 

while True:
    flag = 'yes'
    paren = ()
    msg = stdin.readline().rstrip()
    if msg == '.':
        break 
    for i in msg :
        if i == '('or i=='(':
            paren.append(i)
        elif i==')':
            if len(paren)==0:
                flag = 'no'
                break 
            elif paren.pop() != '(':
                flag = 'no'
                break
        elif i==')':
            if len(paren)==0:
                flag = 'no'
                break 
            elif paren.pop() != '(':
                flag = 'no'
                break
    if len(paren)!= 0:
        flag = 'no'
    print(flag)
  • 스택 활용
  • 열린 브래킷이면 브래킷이 스택으로 푸시되고 닫힌 브래킷을 만나면 스택에서 제거됩니다.
  • 스택이 비어 있을 때 닫는 괄호가 보이거나 문자열이 끝날 때 스택에 여전히 괄호가 있으면 불일치가 있는 것입니다.
  • 이 문제에는 두 가지 유형의 괄호가 있기 때문에 스택에서 꺼낼 때 어떤 괄호를 사용하는지도 중요합니다.
    • 닫는 괄호가 발견되고 스택에서 가져온 괄호가 동일한 유형인 경우: 적절하게 일치하는 괄호입니다.
    • 여는 괄호의 유형이 다른 경우: 일치하지 않는 괄호.