백준|4949번|균형잡힌 세상

README·2022년 7월 31일
0

파이썬 PS풀이

목록 보기
53/136

문제설명
문자열을 입력받고 각 괄호들이 균형을 이루는지 판정하여 출력하는 프로그램입니다.
규칙
1. 모든 왼쪽 소괄호("(")는 오른쪽 소괄호(")")와만 짝을 이뤄야 한다.
2. 모든 왼쪽 대괄호("[")는 오른쪽 대괄호("]")와만 짝을 이뤄야 한다.
3. 모든 오른쪽 괄호들은 자신과 짝을 이룰 수 있는 왼쪽 괄호가 존재한다.
4. 모든 괄호들의 짝은 1:1 매칭만 가능하다. 즉, 괄호 하나가 둘 이상의 괄호와 짝지어지지 않는다.
5. 짝을 이루는 두 괄호가 있을 때, 그 사이에 있는 문자열도 균형이 잡혀야 한다.

작동 순서
1. 문자열을 입력받는다.
2. 문자열이 '.'만 입력된 경우 반복문을 종료한다.
3. 문자열을 리스트 형식으로 분리한다.
4. 문자열에서 ')'이나 ']'이 나온 경우 open 스택에 append한다.
5. 문자열에서 '('이나 '['이 나온 경우 open의 마지막 값과 비교하여 알맞지않은 괄호일 경우 균형이 맞지 않는 걸로 판정하고 no를 출력한다.
6. 모든 문자열을 다 검사한 뒤 open에 남은 값이 없고 isBalanced가 true인 경우 yes를 출력하고 아닌 경우 no를 출력한다.

소스코드

import sys
while True:
    st = sys.stdin.readline().replace('\n', '')
    if st == '.':
        break
    string = list(map(str, st))
    open = []
    isBalanced = True
    while string:
        word = string.pop()
        if word == ')' or word == ']':
            open.append(word)
        if word == '(':
            if len(open) == 0:
                isBalanced = False
                break
            if open.pop() == ']':
                isBalanced = False
                break
        if word == '[':
            if len(open) == 0:
                isBalanced = False
                break
            if open.pop() == ')':
                isBalanced = False
                break
    if len(open) == 0 and isBalanced:
        print("yes")
    else:
        print("no")

후기
이런 유형은 몇번 본적이 있어서 이전에 비슷한 유형의 문제를 풀 때 보다는 적은 시간이 걸린 것 같습니다.

profile
INTP 개발자 지망생

0개의 댓글