문제 풀이/백준

[S4] 백준 4949 - 균형잡힌 세상 (Python3)

gnoJJ 2023. 1. 14. 14:14

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

 

4949번: 균형잡힌 세상

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

www.acmicpc.net


이 문제보다 한 단계 쉬운 문제는 백준 9012번: 괄호라고 생각한다. 이 문제를 풀고나서 이 문제를 푸는 것을 추천한다.


해결방법

스택을 활용하는 문제이다. bracket 이라는 리스트 변수에 여는 괄호("(", "[")를 담고, 닫는 괄호(")", "]")가 나올 때마다 bracket의 원소를 pop 해주는 방식으로 문제를 풀었다.


코드

while (string:=input()) != ".":
    bracket = []
    for w in string:
        if w in ['(', '[']:
            bracket.append(w)
        elif w == ')':
            if len(bracket) > 0 and bracket[-1] == '(':
                bracket.pop()
            else:
                break
        elif w == ']':
            if len(bracket) > 0 and bracket[-1] == '[':
                bracket.pop()
            else:
                break
    else:
        print("no" if len(bracket) > 0 else "yes")
        continue
    print("no")

코드 설명

  • while의 조건식 부분을 바다코끼리 연산자(':=')를 활용해 작성했다.
  • for-else 문을 활용해서 작은 예외의 경우에도 처리 가능하도록 했다. 이전 내 코드의 반례가 '(' 나 '[' 처럼 여는 괄호가 하나만 있는 경우였다. 이를 처리하도록 짠 코드이다.

예전의 나라면 아래 코드처럼 작성했을 것 같다.

string = input()
while string != ".":
    """
        solution
    """
    string = input()

이렇게 작성하면 괜히 같은 코드를 반복하게 되면서 가독성에도 떨어진다고 생각했다. 그래서 바다코끼리 연산자를 활용한 것이다.