본문 바로가기
TIL - 프로그래밍/Python 알고리즘

[백준] 4949. 균형잡힌 세상 - Python

by chaemj97 2022. 6. 13.
728x90

https://www.acmicpc.net/problem/4949

 

4949번: 균형잡힌 세상

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

www.acmicpc.net


  • 생각
    • 모든 걸 다 돌리면 시간 초과가 나지 않을까 해서 괄호만 남기고 돌리기로 결정
      • re.sub(a,b,word) : word의 a를 모두 b로 바꾸기
        • replace 여러개 해야하나 했는데 편했다.
      • 다른 사람 코드 보니 모든 걸 돌려도 됨... 그래도 시간 줄였다.
    • 괄호 짝 확인
      • 여는 괄호면 스택에 넣고
      • 닫는 괄호인데 짝이 맞으면 팝
  • 코드
from sys import stdin
import re

while True:
    result = 'yes'
    s = stdin.readline().rstrip()
    
    # 종료조건(맨 마지막에 점 하나)
    if s == '.':
        break
        
    # 검사!!
    # 숫자 영어 점 공백 제거
    s = re.sub('[0-9a-zA-Z. ]','',s)
    
    # 괄호가 없는거면 공백만 남으니 통과
    if s != '':
        # 괄호 확인
        stack=[]
        
        for i in s:
            # 여는 괄호면 추가
            if i == '(' or i == '[':
                stack.append(i)
                
            # 닫는 괄호, 짝이 존재하고 짝이 맞아
            elif i == ')' and stack and stack[-1] == '(':
                stack.pop()
            # 닫는 괄호, 짝이 존재하고 짝이 맞아
            elif i == ']' and stack and stack[-1] == '[':
                stack.pop()
                
            # 닫는 괄호, 짝이 맞지 않아
            elif i == ')' or i == ']':
                result = 'no'
                break
                
        # 다 했는데 스택에 남아있다 == 짝이 맞지 않다.
        if stack:
            result = 'no'
            
    print(result)

 

728x90
반응형

댓글