https://www.acmicpc.net/problem/4949
4949번: 균형잡힌 세상
각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호("( )"), 대괄호("[ ]")로 이루어져 있으며, 온점(".")으로 끝나고, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마지막에
www.acmicpc.net
자료구조 - 스택(stack)
+
정규표현식
---
1. 스택(리스트)의 인덱스 슬라이싱 범위 제대로 이해하기
2. 문제 제대로 이해하기
처음엔 괄호, 대괄호를 구분하여 각자의 쌍이 맞으면 된다고 접근했으나, 한 문장 안에서 쌍이 맞아야 함.
(), [] 만 인정되고, 똑같은 구성이더라도 (], [) 이면 틀린 것
3. stack이 후입선출 이므로 괄호를 넣으면서 쌍을 이루면 바로 빼주는 식으로 접근. 남아있는 괄호(대괄호)가 있다면 쌍이 맞지 않는다는 것
4. 문장 입력 받을 떄 괄호만 남기는 것을 정규표현식을 사용하여 접근함.
문제에서 주어지기를 괄호를 제외하고는 영어 소문자, 대문자만 주어지기 때문에 정규식을 통해 영어 대소문자, 띄어쓰기는 ""(빈값)으로 변환시켜 줌
[풀이 과정 - 풀면서 잘못된 부분은 주석처리하면서 이해함]
import re
while True:
bracket = [] # 괄호 수집
# sq_bracket = [] # 대괄호 수집
sentence = input().split('.')
sen = re.sub("[a-zA-Z ]", "", sentence[0])
if len(sentence[0]) == 0:
break
elif sentence[0] == ' ':
print('yes')
else:
for i in sen:
if i == '(' or i == ')' or i == '[' or i == ']':
bracket.append(i)
for j in range(1, len(bracket)):
# print('여긴가?',bracket[j-1:j+1])
# print('이거는?', ''.join(bracket[j-1:j+1]))
if ''.join(bracket[j-1:j+1]) == '()' :
bracket.pop()
bracket.pop()
elif ''.join(bracket[j-1:j+1]) == '[]' :
bracket.pop()
bracket.pop()
# print('결과?', bracket)
# elif i == '[' or i == ']' :
# sq_bracket.append(i)
# for j in range(1, len(sq_bracket)):
# if ''.join(sq_bracket[j-1:j+1]) == '[]' :
# sq_bracket.pop()
# sq_bracket.pop()
# else:
# pass
# print('[]결과는?', sq_bracket)
# print(bracket)
if len(bracket) == 0:
print('yes')
else:
print('no')
'문제풀이 > 백준' 카테고리의 다른 글
[python/파이썬] 백준 11005 - 진법 변환 2 (브1) (0) | 2023.07.21 |
---|---|
[python/파이썬] 백준 1874 - 스택 수열 (실2) (0) | 2023.07.20 |
[python/파이썬] 백준 1966 - 프린터 큐 (실3) (1) | 2023.07.17 |
[JAVA/자바] 백준 15552 - 빠른 A+B(브4) (1) | 2023.04.30 |
[JAVA/자바] 백준 25314 - 코딩은 체육과목 입니다(브5) (0) | 2023.04.30 |