uju's Tech

[Baekjoon : Python] 균형잡힌 세상: 4949 본문

Baekjoon

[Baekjoon : Python] 균형잡힌 세상: 4949

ujusy 2020. 7. 31. 00:39

<본 포스팅은 공부목적으로 작성되었습니다. 혹시 틀린 부분이 있거나 문제가 되는 부분이 있다면 답글 달아주세요!>

균형잡힌 세상: 4949


믄제 링크 여기

사용언어: python

문제

세계는 균형이 잘 잡혀있어야 한다. 양과 음, 빛과 어둠 그리고 왼쪽 괄호와 오른쪽 괄호처럼 말이다.

정민이의 임무는 어떤 문자열이 주어졌을 때, 괄호들의 균형이 잘 맞춰져 있는지 판단하는 프로그램을 짜는 것이다.

문자열에 포함되는 괄호는 소괄호("()") 와 대괄호("[]")로 2종류이고, 문자열이 균형을 이루는 조건은 아래와 같다.

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

입력

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

입력의 종료조건으로 맨 마지막에 점 하나(".")가 들어온다.

출력

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

Think(문제 이해하기)

  • 결론: (), [] 이렇게 짝 맞추는 문제이다.
  • 짝이 맞다면 yes 안 맞다면 no 를 출력해준다.
  • 내가 이 문제에서 특히 고려한 것은 stack이 isEmpty일 때와
  • ()( 의 형태일 경우다.
  • stack을 이용하여 (,[ 일 때 append를 이용하여 넣어주고 반대편 괄호가 나올경우 pop을 해주면서 짝이 맞는지 확인하얐다. 또한 짝이 맞지 않을 경우 flag를 바꾸어주었다. 또한 stack 리스트가 모든 과정을 진행했는데도 불구하고 len이 0이 아니라면 위의 신경쓴 형태와 같은 것이므로 이 또한 no를 출력해주었다.

구현 배경 지식

  • 파아썬에서의 stack은 리스트로서 사용 가능하다.
  • 값을 넣을 때는 append를 이용하여 가장 위에 값을 쌓는다.
  • stack은 LIFO로 후입선출구조이다.
  • pop을 통해 값을 빼내올 수 있다.
  • 값을 빼지 않고 가장 위의 값을 알고싶으면 top = stack[-1] 이렇게 사용하자

접근 방법을 적용한 코드 및 해결

import sys

while True:
    stack = []
    word = list(str(sys.stdin.readline()))
    flag = 1
    if word[0] == '.':
        break
    for i in word:
        if (i == '(') or (i=='['):
            stack.append(i)
        elif i == ')':
            if not stack:
                flag = 0
                break
            a = stack.pop()
            if a == '(':
                continue
            else:
                flag = 0
                break
        elif i == ']':
            if not stack:
                flag = 0
                break
            a = stack.pop()
            if a == '[':
                continue
            else:
                flag =0
                break
    if flag == 0 or len(stack) != 0:
        print('no')
    else:
        print('yes')

아쉬운점

  • 코드 정제가 너무 안되었다.
  • 일단 풀이로서 올려놓지만 좀 더 간결하게 작성 가능할 것 같다.
Comments