PS/백준
[백준] 4949번 균형잡힌 세상 (python)
yo0oni
2023. 12. 19. 13:29
https://www.acmicpc.net/problem/4949
4949번: 균형잡힌 세상
각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호("( )"), 대괄호("[ ]")로 이루어져 있으며, 온점(".")으로 끝나고, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마지막에
www.acmicpc.net
문자열들이 .(점)으로 구분되어 주어졌을 때, 각 문자열이 갖는 소괄호와 대괄호가 짝지어져 입력되었는지 확인하는 문제이다.
괄호 문제를 보자마자 스택으로 접근해야겠다는 생각이 들었고, 문제 해결 방법은 아래와 같다.
- 입력받은 문자열을 문자단위로 접근한다.
- 만약 열린 괄호인 경우, 스택에 추가한다.
- 만약 닫힌 대괄호인 경우, 스택의 마지막 괄호가 열린 대괄호인지 확인한다.
- 스택이 비어있지 않고 스택의 마지막 요소가 열린 대괄호이면, 해당 열린 대괄호를 스택에서 제거한다.
- 그렇지 않다면 닫힌 대괄호를 스택에 추가한다.
- 만약 열린 소괄호인 경우, 스택의 마지막 괄호가 열린 소괄호인지 확인한다.
- 스택이 비어있지 않고 스택의 마지막 요소가 열린 소괄호이면, 해당 열린 소괄호를 스택에서 제거한다.
- 그렇지 않다면 닫힌 소괄호를 스택에 추가한다.
- 문자열 접근이 끝나고 최종 스택 크기에 따라 답을 출력한다.
- 스택 크기가 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")