PS/백준

[백준] 4949번 균형잡힌 세상 (python)

yo0oni 2023. 12. 19. 13:29

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

 

4949번: 균형잡힌 세상

각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호("( )"), 대괄호("[ ]")로 이루어져 있으며, 온점(".")으로 끝나고, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마지막에

www.acmicpc.net

 

문자열들이 .(점)으로 구분되어 주어졌을 때, 각 문자열이 갖는 소괄호와 대괄호가 짝지어져 입력되었는지 확인하는 문제이다.

괄호 문제를 보자마자 스택으로 접근해야겠다는 생각이 들었고, 문제 해결 방법은 아래와 같다.

 

  1. 입력받은 문자열을 문자단위로 접근한다.
  2. 만약 열린 괄호인 경우, 스택에 추가한다.
  3. 만약 닫힌 대괄호인 경우, 스택의 마지막 괄호가 열린 대괄호인지 확인한다.
    • 스택이 비어있지 않고 스택의 마지막 요소가 열린 대괄호이면, 해당 열린 대괄호를 스택에서 제거한다.
    • 그렇지 않다면 닫힌 대괄호를 스택에 추가한다.
  4. 만약 열린 소괄호인 경우, 스택의 마지막 괄호가 열린 소괄호인지 확인한다.
    • 스택이 비어있지 않고 스택의 마지막 요소가 열린 소괄호이면, 해당 열린 소괄호를 스택에서 제거한다.
    • 그렇지 않다면 닫힌 소괄호를 스택에 추가한다.
  5. 문자열 접근이 끝나고 최종 스택 크기에 따라 답을 출력한다.
    • 스택 크기가 0이면 yes를 출력한다.
    • 그렇지 않다면 no를 출력한다.

 

소스 코드

while True:
    string = input()
    stack = []

    if string == ".":
        break
    
    for word in string:
        if word == "(" or word == "[":
            stack.append(word)
            
        elif word == "]":
            if stack and stack[-1] == "[":
                stack.pop()
            else:
                stack.append(word)
                break

        elif word == ")":
            if stack and stack[-1] =="(":
                stack.pop()
            else:
                stack.append(word)
                break

    if len(stack) == 0:
        print("yes")

    else:
        print("no")