문제풀이/BOJ

[Python] BOJ/백준 4949번 균형잡힌 세상

서채리 2021. 8. 6. 01:36

[문제]

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

 

4949번: 균형잡힌 세상

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

www.acmicpc.net

 


[풀이]

  1. 문자열을 sentence 변수에 저장한다.
  2. sentence에 있는 문자 하나씩 검사한다
    1. 문자가 '(' 이거나 '[' 인 경우 (열린 문자일 경우)
      1. stack 리스트에 문자를 추가한다.
    2. 문자가 ')' 인 경우
      1. stack 리스트가 empty이거나 stack의 마지막 원소를 꺼냈을 때 '['인 경우
        1. flag를 False로 변환
        2. break로 반복문 나옴
      2. stack의 마지막 원소를 꺼냈을 때 '('인 경우
        1. pop 함수로 stack의 마지막 원소 꺼냄
    3. 문자가 ']' 인 경우
      1. stack 리스트가 empty이거나 stack의 마지막 원소를 꺼냈을 때 '('인 경우
        1. flag를 False로 변환
        2. break로 반복문 나옴
      2. stack의 마지막 원소를 꺼냈을 때 '['인 경우
        1. pop 함수로 stack의 마지막 원소 꺼냄
  3. flag이 True이고 stack이 empty라면 "yes"출력. 아닐 경우 "no" 출력

 


[코드]

if __name__ == '__main__':
    while True:
        sentence = input()
        if sentence == '.':
            break
        stack = []
        flag = True

        for i in sentence:
            if i == '(' or i == '[':
                stack.append(i)
            elif i == ')':
                if not stack or stack[-1] == '[':
                    flag = False
                    break
                elif stack[-1] == '(':
                    stack.pop()
            elif i == ']':
                if not stack or stack[-1] == '(':
                    flag = False
                    break
                elif stack[-1] == '[':
                    stack.pop()

        if flag and not stack:
            print("yes")
        else:
            print("no")