문제설명
문자열을 입력받고 각 괄호들이 균형을 이루는지 판정하여 출력하는 프로그램입니다.
규칙
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")
후기
이런 유형은 몇번 본적이 있어서 이전에 비슷한 유형의 문제를 풀 때 보다는 적은 시간이 걸린 것 같습니다.