Algorithm/Stack & Queue

[백준] 4949번 균형잡힌 세상 (Python 파이썬)

안드선생 2021. 4. 13. 01:36
반응형

www.acmicpc.net/problem/4949

 

4949번: 균형잡힌 세상

하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호("( )") 대괄호("[ ]")등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마

www.acmicpc.net

문제 설명

괄호들의 균형이 잘 맞춰져 있는지 확인하는 문제이다.

괄호는 소괄호"()"와 대괄호"[]"가 있으며 다음과 같은 규칙이 있다.

  • 모든 왼쪽 소괄호("(")는 오른쪽 소괄호(")")와만 짝을 이뤄야 한다.
  • 모든 왼쪽 대괄호("[")는 오른쪽 대괄호("]")와만 짝을 이뤄야 한다.
  • 모든 오른쪽 괄호들은 자신과 짝을 이룰 수 있는 왼쪽 괄호가 존재한다.
  • 모든 괄호들의 짝은 1:1 매칭만 가능하다. 즉, 괄호 하나가 둘 이상의 괄호와 짝지어지지 않는다.
  • 짝을 이루는 두 괄호가 있을 때, 그 사이에 있는 문자열도 균형이 잡혀야 한다.

문제에서 문자열이 주어질 때, 그 문자열이 균형을 이루는 문장인지 확인하면 된다. 종료는 "."으로 한다.


풀이 과정

문자열을 처음부터 차례대로 검사하는데, 괄호가 등장하면 stack에 넣어준다.

1. 소괄호를 닫을 때 스택이 비어있거나, 스택의 top이 대괄호이면 잘못된 문장이다.

2. 대괄호를 닫을 때 스택이 비어있거나, 스택의 top이 괄호이면 잘못된 문장이다.

3. 열린 괄호가 닫힌 괄호보다 많이 등장한다. ( 마지막에 stack이 비어있지 않을 때 )

 

이 세가지 경우를 제외하고는 짝을 맞춰 괄호가 등장한다.

import sys
while True:
    sen = sys.stdin.readline().rstrip()
    flag = 0
    stack = []
    if sen == '.':
        break
    for i in sen:
        if i == "(" or i == "[": #열린 괄호면 스택에 넣어준다.
            stack.append(i)
        elif i == ")": #닫는 소괄호가 등장했을 때
            if not stack or stack[-1] == "[": #열린 괄호가 없거나 열린 대괄호가 나오면
                print("no")
                flag = 1
                break
            else:
                stack.pop()
        elif i == "]": # 닫는 대괄호가 등장했을 때
            if not stack or stack[-1] == "(": #열린 괄호가 없거나 열린 소괄호가 나오면
                print("no")
                flag = 1
                break
            else:
                stack.pop()
    if flag == 0:   #앞서 no가 등장하지 않았을 때
        if not stack :  #스택이 비어있다 = 모든 괄호가 짝을 맞췄다
            print("yes")
        else:
            print("no")

 

https://github.com/HongEunho

전체 문제 & 코드는 위의 깃에 정리되어 있습니다.

팔로우 & 맞팔은 환영입니다 !

반응형